按组计算累计总和(cumsum)。

问题描述 投票:36回答:4

与数据框架。

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

r cumsum
4个回答
39
投票
df$csum <- ave(df$value, df$id, FUN=cumsum)

ave 是 "去 "的函数,如果你想要一个与现有向量等长的按组向量,并且它可以单独从这些子向量中计算出来。如果你需要基于多个 "并行 "值的按组处理,基本策略是 do.call(rbind, by(dfrm, grp, FUN)).


20
投票

除备选方案外,还有: 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.framedata.table 参照
  • 计算按id分组的累计值总和,并通过参考进行分配
  • 打印(最后一个 [] 那里

"df "现在将是一个 data.table 与 "csum "列。


13
投票

使用dplyr::

require(dplyr)
df %>% group_by(id) %>% mutate(csum = cumsum(value))

8
投票

使用库 plyr.

library(plyr)
ddply(df,.(id),transform,csum=cumsum(value))
© www.soinside.com 2019 - 2024. All rights reserved.