我想知道是否有任何方法可以对矩阵中的加权算术进行矢量化处理。例如计算给定values
下面的weights
的加权平均值:
set.seed(12321)
values = matrix(sample(10:40, 6, replace = TRUE), ncol = 2)
weights = matrix(sample(1:5, 6, replace = TRUE), ncol = 2)
我们可以做到:
w.mean = numeric()
for (i in 1:dim(values)[1]){
w.mean[i] = stats::weighted.mean(x=values[i,], w = weights[i,])
}
但是对于大型矩阵来说,速度并不快。我想知道是否有使用apply
系列或aggregate
或类似名称的完全矢量化方式。
答案 0 :(得分:2)
您可以尝试将值和权重分组在一个数据框中。
value_weight <- data.frame(group = rep(1:2, each = 3),
value = sample(10:40, 6, replace = TRUE),
weight = sample(1:5, 6, replace = TRUE))
,然后使用plyr
库
ddply(value_weight, .(group), # split the data frame according to group
function(x) data.frame(wret = weighted.mean(x$value, x$weight)))
更多信息here
答案 1 :(得分:0)
谢谢大家。真正有见地的答案。我对其进行了测试,结果发现sapply
很快,而之后abind
很快。但是,在我的原始数据集中,我有一些分组,这些分组是使用dcast
按组进行汇总的。但是,在看到关于ddply
的建议之后,我又回到了它。我意识到使用`data.table'使其速度提高了几个数量级:
n = 1000
DT = data.table(id = sample(LETTERS[1:10], size = n, replace = TRUE),
value = sample(seq(20,30), size = n, replace = TRUE),
weight = sample(seq(1,5), size = n, replace = TRUE))
wtd_var = DT[,lapply(.SD,function(x)(weightedVar(as.numeric(x),w=weight))),by=id,.SDcols='value']
wtd_var
data.table
的确是岩石!