【问题标题】:Cumulative count of each value [duplicate]每个值的累积计数[重复]
【发布时间】:2012-04-19 05:31:46
【问题描述】:

我想创建每个值出现次数的累积计数器。

例如说我有专栏:

id  
1  
2  
3  
2  
2  
1  
2  
3

这将变成:

id   count  
1     1  
2     1  
3     1  
2     2  
2     3  
1     2  
2     4  
3     2  

等等……

谢谢

【问题讨论】:

    标签: r count cumulative-sum


    【解决方案1】:

    这是一种获取计数的方法:

    id <- c(1,2,3,2,2,1,2,3)
    
    sapply(1:length(id),function(i)sum(id[i]==id[1:i]))
    

    这给了你:

    [1] 1 1 1 2 3 2 4 2
    

    【讨论】:

    • @user1165199:如果这最能回答您的问题,请单击复选标记。
    • 这是王牌。将其绑定到 data.table 对象中也很简单。
    【解决方案2】:

    ave 函数按组计算函数。

    > id <- c(1,2,3,2,2,1,2,3)
    > data.frame(id,count=ave(id==id, id, FUN=cumsum))
      id count
    1  1     1
    2  2     1
    3  3     1
    4  2     2
    5  2     3
    6  1     2
    7  2     4
    8  3     2
    

    我使用id==id 创建一个包含所有TRUE 值的向量,这些值在传递给cumsum 时会转换为数字。您可以将id==id 替换为rep(1,length(id))

    【讨论】:

      【解决方案3】:

      我拥有的数据框太大,接受的答案不断崩溃。这对我有用:

      library(plyr)
      df$ones <- 1
      df <- ddply(df, .(id), transform, cumulative_count = cumsum(ones))
      df$ones <- NULL 
      

      【讨论】:

        【解决方案4】:

        获取任意数组的累积计数的函数,包括非数字数组:

        cumcount <- function(x){
          cumcount <- numeric(length(x))
          names(cumcount) <- x
        
          for(i in 1:length(x)){
            cumcount[i] <- sum(x[1:i]==x[i])
          }
        
          return(cumcount)
        }
        

        【讨论】:

          【解决方案5】:

          dplyr 方式:

          library(dplyr)
          
          foo <- data.frame(id=c(1, 2, 3, 2, 2, 1, 2, 3))
          foo <- foo %>% group_by(id) %>% mutate(count=row_number())
          foo
          
          # A tibble: 8 x 2
          # Groups:   id [3]
               id count
            <dbl> <int>
          1     1     1
          2     2     1
          3     3     1
          4     2     2
          5     2     3
          6     1     2
          7     2     4
          8     3     2
          

          最终按id 分组。如果您不希望它分组,请添加%&gt;% ungroup()

          【讨论】:

            【解决方案6】:

            为了完整性,添加一个data.table方式:

            library(data.table)
            
            DT <- data.table(id = c(1, 2, 3, 2, 2, 1, 2, 3))
            
            DT[, count := seq(.N), by = id][]
            

            输出:

               id count
            1:  1     1
            2:  2     1
            3:  3     1
            4:  2     2
            5:  2     3
            6:  1     2
            7:  2     4
            8:  3     2
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2019-02-04
              • 2017-03-23
              • 2018-03-15
              • 2014-01-03
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多