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
谢谢!
我正在寻找一种在大型数据库上实现滚动求和的快速方法。我想要的是一个快速的函数,它支持左(和右)对齐和最小观察的争论。
本质上,即使样本量小于指定宽度,我也想计算滚动总和。 在下面的示例中,我希望在接下来的 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)
会产生所需的输出,但我正在寻找更快的解决方案。
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
谢谢!