将 rollapply() 和 weighted.mean() 组合在 data.table apply() 中用于多列

Combining rollapply() and weighted.mean() in a data.table apply() for multiple columns

我正在尝试使用 rollapply()weighted.mean() 计算 data.table 中各个列的加权平均值,如下所示:

DT <- data.table(id = rep(c(1,2), each = 5),
                 var1 = 1:10,
                 var2 = 11:20)
col_names <- c('var1', 'var2')
DT[, (col_names) := lapply(.SD, 
                           function(x) rollapplyr(x, 
                                                  width = 3,
                                                  weighted.mean, 
                                                  w = c(0.2, 0.3, 0.5),
                                                  align = 'right', 
                                                  partial = TRUE, 
                                                  na.rm = TRUE)),
   by = id,
   .SDcols = col_names]

但是,我收到错误消息:

Error in weighted.mean.default(data[replace(posns, !ix, 0)], ...) : 
  'x' and 'w' must have the same length 

是否因为 .SD 是 data.table 而 weighted.mean() 不适用于 data.tables?

有没有办法让它起作用?

如果我们删除 partial = TRUE,它应该与添加 fill = NA

一起工作
library(data.table)
DT[, (col_names) := lapply(.SD, 
                           function(x) rollapplyr(x, 
                                                  width = 3,
                                                  weighted.mean, 
                                                  w = c(0.2, 0.3, 0.5),
                                                  align = 'right', 
                                                  fill = NA
                                                  )),
   by = id,
   .SDcols = col_names]

对于partial = TRUE,'w'长度与3相同,并且没有子集,这会在'x'和'w'[=14之间产生长度差异误差=]