计算每个ID(组)内的累积总和

Roc*_*ock 30 r cumsum

使用数据框:

df <- data.frame(id = rep(1:3, each = 5)
                 , hour = rep(1:5, 3)
                 , value = sample(1:15))
Run Code Online (Sandbox Code Playgroud)

我想添加一个匹配的累积和列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
Run Code Online (Sandbox Code Playgroud)

我怎样才能有效地做到这一点?谢谢!

42-*_*42- 35

df$csum <- ave(df$value, df$id, FUN=cumsum)
Run Code Online (Sandbox Code Playgroud)

  • 请注意,如果多列定义每个唯一行,则可以添加其他`id`变量.例如,`df $ csum < - ave(df $ value,df $ id1,df $ id2,FUN = cumsum)`. (2认同)

A5C*_*2T1 19

要添加替代方案,data.table语法很好:

library(data.table)
DT <- data.table(df, key = "id")
DT[, csum := cumsum(value), by = key(DT)]
Run Code Online (Sandbox Code Playgroud)

或者,更紧凑:

library(data.table)
setDT(df)[, csum := cumsum(value), id][]
Run Code Online (Sandbox Code Playgroud)

以上将:

  • 通过引用转换data.frame为adata.table
  • 计算按ID分组的累计值总和,并按引用分配
  • 打印(最后[]那里)整个操作的结果

"df"现在将data.table成为"csum"列.


Tje*_*ebo 10

使用dplyr ::

require(dplyr)
df %>% group_by(id) %>% mutate(csum = cumsum(value))
Run Code Online (Sandbox Code Playgroud)

  • 你好,我试过你的方法。不知何故,分组工作不正常。它对所有数据点进行 cumsum 而不进行分组。有什么建议? (2认同)
  • 只是一个更新,你可能有一个已经加载了 `plyr` 的包。显式引用`dplyr`也会修复它:``` df %&gt;% group_by(id) %&gt;% dplyr::mutate(csum = cumsum(value)) ``` (2认同)

Did*_*rts 8

使用库plyr.

library(plyr)
ddply(df,.(id),transform,csum=cumsum(value))
Run Code Online (Sandbox Code Playgroud)