每个值的累积计数[重复]

Posted

技术标签:

【中文标题】每个值的累积计数[重复]【英文标题】: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  

等等……

谢谢

【问题讨论】:

【参考方案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

【讨论】:

以上是关于每个值的累积计数[重复]的主要内容,如果未能解决你的问题,请参考以下文章

重复的累积计数

累积总和数据帧的条件计数 - 遍历列

SQL 累积不重复计数

获取每个二维数组的累积计数

SQL Server - 每季度不同客户的运行计数

分组用户 - 按月累积计数