我有数据
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
我希望在val
的每个级别内获得group
的累积值。
> 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
中完成这项工作,但当然任何其他有效的解决方案都是受欢迎的。
答案 0 :(得分:0)
您可以使用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