每个值的累积计数[重复]
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
分组。如果您不希望它分组,请添加%>% 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
【讨论】:
以上是关于每个值的累积计数[重复]的主要内容,如果未能解决你的问题,请参考以下文章