如果下一个值相同,则添加数字r

时间:2016-11-23 08:48:18

标签: r

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

> 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密耳的观察值,因此计算时间过于高。还有其他方法可以实现这个结果吗?

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

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
    }
}

4 个答案:

答案 0 :(得分: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 :(得分:1)

使用dplyr包,您可以使用以下

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

答案 2 :(得分:1)

另一个dplyr回答......

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

答案 3 :(得分:1)

我们可以在sequence

中将base Rdf1$Counter <- unname(sequence(table(df1$User_ID))) df1$Counter #[1] 1 2 3 4 5 1 1 2 3 4 5 6 一起使用
NSDate