我们的目标是计算加权平均值,在窗口中有3行,权重为3,2,1,按最近的行的顺序排列。这与问题here类似,但权重不是由列给出的。此外,我真的很想使用frollsum()
,因为我正在处理大量数据,需要它的性能。
我有一个使用frollapply()
的解决方案:
library(data.table)
# Your data
set.seed(1)
DT <- data.table(group = rep(c(1, 2), each = 10), value = round(runif(n = 20, 1, 5)))
weights <- 1:3
k <- 3
weighted_average <- function(x) {
sum(x * weights[1:length(x)]) / sum(weights[1:length(x)])
}
# Apply rolling weighted average
DT[, wtavg := shift(frollapply(value, k, weighted_average, align = "right", fill = NA)),
by = group]
DT
#> group value wtavg
#> 1: 1 2 NA
#> 2: 1 2 NA
#> 3: 1 3 NA
#> 4: 1 5 2.500000
#> 5: 1 2 3.833333
#> 6: 1 5 3.166667
#> 7: 1 5 4.000000
#> 8: 1 4 4.500000
#> 9: 1 4 4.500000
#> 10: 1 1 4.166667
#> 11: 2 2 NA
#> 12: 2 2 NA
#> 13: 2 4 NA
#> 14: 2 3 3.000000
#> 15: 2 4 3.166667
#> 16: 2 3 3.666667
#> 17: 2 4 3.333333
#> 18: 2 5 3.666667
#> 19: 2 3 4.333333
#> 20: 2 4 3.833333
字符串
创建于2023-11-27使用reprex v2.0.2
2条答案
按热度按时间06odsfpq1#
可能不是最佳方式(我会研究Rcpp),但你可以简单地使用frollsum thrice来获得显著的速度:
字符串
请注意,
frollsum(value, 1)
可以替换为value
。另一个(看起来)更快更简单的选择:
型
标杆
型
7eumitmz2#
我使用
frollsum()
、frollapply()
和RcppRoll::roll_meanr()
在不同的滞后长度、组数和观察数下进行了更多的基准测试,每种方法都适合接受多个变量。RcppRoll::roll_meanr()
是明显的赢家。字符串
x1c 0d1x的数据
创建于2023-12-09带有reprex v2.0.2