在R的data.table中求取累加和

4
我有一个在 R 里的 data.table,想要对其进行分组并实现滚动求和。但问题是每个分组长度不一致,当 rollapply 函数处理较短的分组时会出现错误。是否有方法可以解决这个问题,而不用使用 for 循环呢?
以下是一个简单的示例来说明这个问题。
DT <- data.table(id = c(rep("A", 6), rep("B", 2), rep("C", 8)),
                 val = c(1:6, 1:2, 1:8))
> DT
    id val
 1:  A   1
 2:  A   2
 3:  A   3
 4:  A   4
 5:  A   5
 6:  A   6
 7:  B   1
 8:  B   2
 9:  B   1
10:  B   2
11:  B   3
12:  B   4
13:  B   5
14:  B   6
15:  C   7
16:  C   8

使用rollapplyr()实现对4个数字的滚动求和。

DT[, cum.sum := rollapplyr(val, width = 4, FUN = sum, fill = NA), by = id]

但是这会给我一个错误。
Error in seq.default(start.at, NROW(data), by = by) : wrong sign in 'by' argument

输出结果为

> DT
    id val cum.sum
 1:  A   1      NA
 2:  A   2      NA
 3:  A   3      NA
 4:  A   4      10
 5:  A   5      14
 6:  A   6      18
 7:  B   1      NA
 8:  B   2      NA
 9:  C   1      NA
10:  C   2      NA
11:  C   3      NA
12:  C   4      NA
13:  C   5      NA
14:  C   6      NA
15:  C   7      NA
16:  C   8      NA

理想情况下,输出应该是:
> DT
    id val cum.sum
 1:  A   1      NA
 2:  A   2      NA
 3:  A   3      NA
 4:  A   4      10
 5:  A   5      14
 6:  A   6      18
 7:  B   1      NA
 8:  B   2      NA
 9:  C   1      NA
10:  C   2      NA
11:  C   3      NA
12:  C   4      10
13:  C   5      14
14:  C   6      18
15:  C   7      22
16:  C   8      26

尝试将id转换为因子,使用DT$id = as.factor(DT$id) - cgage1
1个回答

14
我们可以做到。
DT[, cum.sum := Reduce(`+`, shift(val, 0:3)), by=id]

    id val cum.sum
 1:  A   1      NA
 2:  A   2      NA
 3:  A   3      NA
 4:  A   4      10
 5:  A   5      14
 6:  A   6      18
 7:  B   1      NA
 8:  B   2      NA
 9:  C   1      NA
10:  C   2      NA
11:  C   3      NA
12:  C   4      10
13:  C   5      14
14:  C   6      18
15:  C   7      22
16:  C   8      26

我知道我之前在某个地方看过这个——可能是一个重复的内容?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接