2016-11-23 64 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 
相關問題