R 每个值的累积计数

R 每个值的累积计数,r,count,cumulative-sum,R,Count,Cumulative Sum,我想创建一个每个值出现次数的累积计数器 e、 g.假设我有专栏: 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 等等 谢谢以下是获取计数的方法: id <- c(1,2,3,2,2,1,2,3) sapply(1:length(id),function(i)sum(

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

e、 g.假设我有专栏:

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


谢谢

以下是获取计数的方法:

id <- c(1,2,3,2,2,1,2,3)

sapply(1:length(id),function(i)sum(id[i]==id[1:i]))

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 data.frame(id,count=ave(id==id,id,FUN=cumsum))
身份证计数
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))
我拥有的数据帧太大,接受的答案不断崩溃。这对我很有用:

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

df$ones函数以获取任何数组(包括非数字数组)的累积计数:

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

cumcountdplyr

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
库(dplyr)
foo%变异(计数=行数()
福
#一个tibble:8x2
#组别:id[3]
身份证计数
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()

以确保完整性,添加数据。表格方式:

library(data.table)

DT <- data.table(id = c(1, 2, 3, 2, 2, 1, 2, 3))

DT[, count := seq(.N), by = id][]

@用户1165199:如果这最能回答您的问题,请单击复选标记。这是ace。将其绑定到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