data.table:按变量分组的累积值

data.table: cumulative values by grouping variable

我有资料

set.seed(42)
dat <- data.table(id=1:8, group=c(1,1,2,2,2,3,3,3), val=rnorm(8))

> dat
   id group         val
1:  1     1  1.37095845
2:  2     1 -0.56469817
3:  3     2  0.36312841
4:  4     2  0.63286260
5:  5     2  0.40426832
6:  6     3 -0.10612452
7:  7     3  1.51152200
8:  8     3 -0.09465904

并且我想在 group 的每个级别中获得 val 的累积值。

> res
   id group         cum
1:  1     1  1.37095845
2:  2     1  0.80626037
3:  3     2  0.36312841
4:  4     2  0.995991
5:  5     2  1.400259
6:  6     3 -0.10612452
7:  7     3  1.405397
8:  8     3  1.310738

我总是对 data.table 的效率感到惊讶,所以我想知道如何在 data.table 中完成这项工作,当然,任何其他有效的解决方案也同样受欢迎。

您可以使用 cumsum

dat[, cum:= cumsum(val), by = group]
dat[, val := NULL]

   id group        cum
1:  1     1  1.3709584
2:  2     1  0.8062603
3:  3     2  0.3631284
4:  4     2  0.9959910
5:  5     2  1.4002593
6:  6     3 -0.1061245
7:  7     3  1.4053975
8:  8     3  1.3107384