在R中的data.table中如何计算部分滚动和

4
我正在寻找一种快速的方法来对大型数据库执行滚动求和。我想要一个快速的函数,支持左对齐(和右对齐),并带有一个最小观测值参数。
本质上,即使样本大小小于指定宽度,我也想计算滚动总和。在下面的示例中,每当下一个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包的roll_sum也很快,并接受最小观测值的值,但不支持左对齐。
先行致谢。

还有 RcppRoll::roll_sum,我相信它很快,但是它的partial还没有被定义。 - Ronak Shah
2
data.table的frollapply函数文档说明可以使用adaptive参数实现部分窗口。 - Edward
2个回答

7
data.table_1.12.8 开始,frollsum 不支持在使用 adaptive=TRUE 的情况下使用align="left"。但是,您可以使用 rev 进行以下调整:
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

希望这足够快。


1
很棒的答案。自适应参数的对齐方式很棘手,因此没有实现。在这种情况下,自适应是允许部分窗口的基本内容。计划在非自适应版本中添加部分参数,这样它就可以与对齐良好地配合使用了。 - jangorecki

0

我之前没有想过使用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

谢谢!


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