use*_*199 25 r count cumulative-sum
有没有办法计算对象在R中累积出现在列中的次数?
比如说我有专栏:
id
1
2
3
2
2
1
2
3
Run Code Online (Sandbox Code Playgroud)
这会变成:
id count
1 1
2 1
3 1
2 2
2 3
1 2
2 4
3 2
Run Code Online (Sandbox Code Playgroud)
等等...
谢谢
Jos*_*ich 30
该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
Run Code Online (Sandbox Code Playgroud)
我id==id用来创建所有TRUE值的向量,传递给它时会转换为数字cumsum.你可以替换id==id使用rep(1,length(id)).
以下是获取计数的方法:
id <- c(1,2,3,2,2,1,2,3)
sapply(1:length(id),function(i)sum(id[i]==id[1:i]))
Run Code Online (Sandbox Code Playgroud)
哪个给你:
[1] 1 1 1 2 3 2 4 2
Run Code Online (Sandbox Code Playgroud)
道路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
Run Code Online (Sandbox Code Playgroud)
最终按 分组id。如果您不想将其分组,请添加%>% ungroup().
小智 5
为了完整起见,添加 data.table 方式:
library(data.table)
DT <- data.table(id = c(1, 2, 3, 2, 2, 1, 2, 3))
DT[, count := seq(.N), by = id][]
Run Code Online (Sandbox Code Playgroud)
输出:
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
Run Code Online (Sandbox Code Playgroud)