将 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之间产生长度差异误差=]
我正在尝试使用 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之间产生长度差异误差=]