r 中 data.table 中的部分滚动总和

partial rolling sum in data.table in r

我正在寻找一种在大型数据库上实现滚动求和的快速方法。我想要的是一个快速的函数,它支持左(和右)对齐和最小观察的争论。

本质上,即使样本量小于指定宽度,我也想计算滚动总和。 在下面的示例中,我希望在接下来的 5 个值可用时对接下来的 5 个值求和,如果前导值的大小小于 5,则对剩余的所有值求和。

示例: x <- seq(1:10)

期望的输出:

15 20 25 30 35 40 34 27 19 10

我知道 rollapply(x,5, sum, align = "left", partial=1) 会产生所需的输出,但我正在寻找更快的解决方案。

包 data.table 中的

frollsum 速度很快,但似乎没有关于最小观察的争论。 roll_sum 来自包 roll 也很快并且接受最小观察值,但不支持左对齐。

提前致谢。

data.table_1.12.8 开始,frollsum 不支持 align="left"adaptive=TRUE,但是您可以使用 rev:[=16 进行如下调整=]

library(data.table) #data.table_1.12.8

lrfrollsum <- function(x, k, align) {
    nk <- c(seq.int(k), rep(k, length(x) - k))
    switch(align, 
        left={ 
            rev(frollsum(rev(x), nk, align="right", adaptive=TRUE))
        },
        right={
            frollsum(x, nk, align="right", adaptive=TRUE)   
        })
}

x <- 1:10

lrfrollsum(x, 5, align="left")
# [1] 15 20 25 30 35 40 34 27 19 10

lrfrollsum(x, 5, align="right")
# [1]  1  3  6 10 15 20 25 30 35 40

希望这足够快。

我没想过要用rev!受@chinsoon12 回答的启发,另一种可能的解决方案是

library(roll)
x <- seq(1:10)
rev(roll_sum(rev(x),5,min_obs = 1))
# [1] 15 20 25 30 35 40 34 27 19 10

谢谢!