我想为像这样的数据表计算每个组的滚动加权平均值:
我想为像这样的数据表计算每个组的滚动加权平均值:
DT <- data.table(group = rep(c(1,2), each = 5), value = 1:10, weight = 11:20)
group value weight
1: 1 1 11
2: 1 2 12
3: 1 3 13
4: 1 4 14
5: 1 5 15
6: 2 6 16
7: 2 7 17
8: 2 8 18
9: 2 9 19
10: 2 10 20
我在这个问题 Rolling over function with 2 vector arguments 中找到了一个使用runner
包的有效解决方案:
my_weighted_mean <- function(data) {
weighted.mean(data[, 1], w = data[, 2])
}
DT[, weighted_mean := runner::runner(x = .SD, f = my_weighted_mean , k = 3, na_pad = TRUE), .SDcols = c("value", "weight"), by = list(group)]
但是代码运行速度非常慢。
我猜应该可以使用 frollapply
,但以下代码并不能正常工作,因为我不知道如何使用一个双列函数来调用 frollapply:
DT[, weighted_mean := frollapply(value, FUN = weighted.mean, n = 3, w = weights), by = list(group)]
寻找更好的性能(并且不需要运行程序的解决方案)