【问题标题】:Adding number if next value the same r [duplicate]如果下一个值相同,则添加数字 r [重复]
【发布时间】:2016-11-23 17:33:10
【问题描述】:

我在 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

我可以用一个循环来做到这一点,但数据框有超过 2000 万个观测值,所以计算时间肯定太长了。有没有其他方法可以达到这个效果?

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

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

【问题讨论】:

标签: r


【解决方案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() ) )

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      另一个 dplyr 答案...

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

      【讨论】:

        【解决方案4】:

        我们可以在base R 中使用table 和sequence

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-01-04
          • 1970-01-01
          • 2017-07-04
          • 2022-01-17
          • 2018-08-20
          • 1970-01-01
          相关资源
          最近更新 更多