2016-11-23 36 views
-2

我在R中遇到以下问题。我有一个数据框,其中包含标识客户的值。有一个带有用户ID的列。我需要在计数器中添加另一列,数据中特定客户的出现次数是多少。数据帧按用户ID排序。所以,我有类似的东西:如果下一个值相同,则添加数字r

> niekonwersyjne[c(57:62,72:77),1] 
        User_ID 
AMsySZa--1Og4WwseZJKRyABTWdh  
AMsySZa--1Og4WwseZJKRyABTWdh  
AMsySZa--1Og4WwseZJKRyABTWdh  
AMsySZa--1Og4WwseZJKRyABTWdh  
AMsySZa--1Og4WwseZJKRyABTWdh  
AMsySZa--1qZghdxj4gypoSQRt_F  
AMsySZa--2gL6xRCZFUCOXtpYxNs  
AMsySZa--2gL6xRCZFUCOXtpYxNs  
AMsySZa--2gL6xRCZFUCOXtpYxNs  
AMsySZa--2gL6xRCZFUCOXtpYxNs  
AMsySZa--2gL6xRCZFUCOXtpYxNs  
AMsySZa--2gL6xRCZFUCOXtpYxNs  

但需要的东西是这样的:

> niekonwersyjne[c(57:62,72:77),c(1,11)] 
        User_ID Counter 
AMsySZa--1Og4WwseZJKRyABTWdh  1 
AMsySZa--1Og4WwseZJKRyABTWdh  2 
AMsySZa--1Og4WwseZJKRyABTWdh  3 
AMsySZa--1Og4WwseZJKRyABTWdh  4 
AMsySZa--1Og4WwseZJKRyABTWdh  5 
AMsySZa--1qZghdxj4gypoSQRt_F  1 
AMsySZa--2gL6xRCZFUCOXtpYxNs  1 
AMsySZa--2gL6xRCZFUCOXtpYxNs  2 
AMsySZa--2gL6xRCZFUCOXtpYxNs  3 
AMsySZa--2gL6xRCZFUCOXtpYxNs  4 
AMsySZa--2gL6xRCZFUCOXtpYxNs  5 
AMsySZa--2gL6xRCZFUCOXtpYxNs  6 

我能做到这一点有一个循环,但该数据帧有超过20万的意见,以便计算时间defintely太高。有没有其他方法可以达到这个结果?

,我使用的是现在的循环如下所示:

niekonwersyjne$Counter<-1 

for (i in 2:nrow(niekonwersyjne)) { 
    if (niekonwersyjne[i-1,"User_ID"]==niekonwersyjne[i,"User_ID"]) { 
    niekonwersyjne[i,"Counter"]<-niekonwersyjne[i-1,"Counter"]+1} else { 
     niekonwersyjne[i,"Counter"]<-1 
    } 
} 
+2

或者[在R中为一组相似的行添加一个计数器列](http://stackoverflow.com/questions/19848362/adding-a-counter-column-for-a-set-of-similar -row-in-r)或者[我如何可以更快地对组内观察值进行排名?](http://stackoverflow.com/questions/6162685/how-can-i-rank-observations-in-group-faster) –

+1

'ave(df $ User_ID,df $ User_ID,FUN = function(i)seq_along(i))' – Sotos

回答

1

我找到data.table方法相当不错:

library(data.table) 
setDT(df)[ , counter := seq_len(.N), by = User_ID ] 

这种“分裂”的数据为依据的by子集参数(此处为User_ID),并为每个组添加一个序列,其长度与组本身相同。

或用dplyr

library(dplyr) 
df <- df %>% 
    group_by(User_ID) %>% 
    mutate(counter = seq_len(n())) 
1

使用dplyr包,你可以使用下面的

library(dplyr) 
niekonwersyjne %>% group_by(User_ID) %>% mutate(Counter = row_number()) 
1

另一个dplyr答案...

df %>% group_by(User_ID) %>% mutate(ct = 1, counter = cumsum(ct)) 
1

我们可以使用tablesequencebase R

df1$Counter <- unname(sequence(table(df1$User_ID))) 
df1$Counter 
#[1] 1 2 3 4 5 1 1 2 3 4 5 6 
相关问题