2017-05-29 105 views
-1

我有一个数据框相对于访问网站。每天多次访问,用行动根据其他列中值的顺序创建新变量

People | Date  | Time | Action | Descr | 
     |   |  |  |  | 
j  | 01/01/2010 | 10:13 | X  | A  | 
j  | 01/01/2010 | 10:15 | Y  | B  | 
j  | 02/01/2010 | 14:15 | Z  | C  | 
j  | 03/01/2010 | 11:45 | X  | D  | 
j  | 03/01/2010 | 13:56 | X  | E  | 
j  | 03/01/2010 | 18:43 | Z  | F  | 
j  | 03/01/2010 | 18:44 | X  | A  | 

的不同可能采取的行动,并说明减少了数据帧到一个平衡的日常面板数据后,我需要创建变量,即:

的-the值第一个变量(FirstX)必须等于当天第一个Action = X的描述(Descr)(如果可用),否则为零。

- 第二个变量的值必须等于第二个Action =当天的X,否则为零

- 所以在

有一次,我把它改造成一个均衡的日常面板(这是我能做到),我需要有一个最终的结果看起来是这样的:

People | Date  |Accesses| First X|Second X| Third X| Fourth X | 
     |   |  |  |  |  |   | 
j  | 01/01/2010 | 2 | A | 0 | 0 | 0  | 
j  | 02/01/2010 | 1 | 0 | 0 | 0 | 0  | 
j  | 03/01/2010 | 4 | D | E | A | 0  | 
+2

你能显示预期的输出吗 – akrun

+0

@akrun我编辑过,谢谢。 – Antonio

回答

0

我自己找到了解决方案。如果这对某人有用,我会在这里发布它。

# create temp variables to be used for the count(just a vector of all the 
numbers from 1 to N) 
subset$temp_var1<-c(1:N) 


#generate a variable which starts counting from one and starts again 
every time "date" or "people" change 
subset$count<-ave(subset$temp_var1 , subset$date , 
subset$people , FUN = seq_along) 

#drop variable "Action" 
subset<-subset(subset, select=c("people" , "date" , 
"descr" , "count")) 

#reshape 
subset_comuni<-reshape(subset_comuni , idvar=c("nome_utente" , "date") , 
timevar = "count" , direction = "wide") 
0

你可以把它用做dplyr包:

library(dplyr)  
df %>% 
group_by(People,Date) %>% 
summarise(Accesses = n(), 
FirstX = ifelse(sum(Action=="X")>=1,Descr[Action=="X"][1],"0"), 
SecondX = ifelse(sum(Action=="X")>=2,Descr[Action=="X"][2],"0"), 
ThirdX = ifelse(sum(Action=="X")>=3,Descr[Action=="X"][3],"0"), 
FourthX = ifelse(sum(Action=="X")>=4,Descr[Action=="X"][4],"0")) 

这将返回:

People  Date Accesses FirstX SecondX ThirdX FourthX 
    <chr>  <chr> <int> <chr> <chr> <chr> <chr> 
1  j 01/01/2010  2  A  0  0  0 
2  j 02/01/2010  1  0  0  0  0 
3  j 03/01/2010  4  D  E  A  0 

请注意,您不能在同一个向量中包含数字0和字符,因此我将字符0置于FirstX,SecondX,..列中。

+0

谢谢你的回答,但这是完全不同的事情。它给我巨大的数值作为输出,我甚至不知道他们从哪里来的 – Antonio

+0

这很奇怪..我不能重现你的问题。你在问题中给出的示例数据框是否遇到了这个问题? – Lamia

+0

对不起,延迟回复。我没有尝试使用示例数据框,但我的数据框与此非常相似。虽然我没有得到你的代码,但你为什么使用sum()? – Antonio