[英]Calculate cumulative sum (cumsum) by group
带数据框:
df <- data.frame(id = rep(1:3, each = 5)
, hour = rep(1:5, 3)
, value = sample(1:15))
我想添加一个与id
匹配的累积总和列:
df
id hour value csum
1 1 1 7 7
2 1 2 9 16
3 1 3 15 31
4 1 4 11 42
5 1 5 14 56
6 2 1 10 10
7 2 2 2 12
8 2 3 5 17
9 2 4 6 23
10 2 5 4 27
11 3 1 1 1
12 3 2 13 14
13 3 3 8 22
14 3 4 3 25
15 3 5 12 37
我怎样才能有效地做到这一点? 谢谢!
df$csum <- ave(df$value, df$id, FUN=cumsum)
如果您想要一个与现有向量长度相等的按组向量,则ave
是“首选”函数,并且可以单独从这些子向量中计算出来。 如果您需要基于多个“并行”值的按组处理,则基本策略是do.call(rbind, by(dfrm, grp, FUN))
。
要添加替代方案, data.table
的语法很好:
library(data.table)
DT <- data.table(df, key = "id")
DT[, csum := cumsum(value), by = key(DT)]
或者,更简洁:
library(data.table)
setDT(df)[, csum := cumsum(value), id][]
以上将:
data.frame
转换为data.table
[]
那里)整个操作的结果 “df”现在将是一个带有“ data.table
”列的 data.table。
使用 dplyr::
require(dplyr)
df %>% group_by(id) %>% mutate(csum = cumsum(value))
使用库plyr
。
library(plyr)
ddply(df,.(id),transform,csum=cumsum(value))
使用基础 R
df <- data.frame(id = rep(1:3, each = 5)
, hour = rep(1:5, 3)
, value = sample(1:15))
transform(df , csum = ave(value , id , FUN = cumsum))
#> id hour value csum
#> 1 1 1 4 4
#> 2 1 2 12 16
#> 3 1 3 13 29
#> 4 1 4 6 35
#> 5 1 5 5 40
#> 6 2 1 15 15
#> 7 2 2 1 16
#> 8 2 3 2 18
#> 9 2 4 8 26
#> 10 2 5 9 35
#> 11 3 1 11 11
#> 12 3 2 7 18
#> 13 3 3 10 28
#> 14 3 4 3 31
#> 15 3 5 14 45
由reprex 包(v2.0.1) 创建于 2022-06-05
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.