繁体   English   中英

按组计算累积和(cumsum)

[英]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
  • 计算按id分组的value的累积总和,并通过引用赋值
  • 打印(最后一个[]那里)整个操作的结果

“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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM