【发布时间】:2019-06-27 20:09:07
【问题描述】:
我想知道是否有任何方法可以跨矩阵矢量化加权算术。例如用于计算下面给定weights 的values 的加权平均值:
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 family 或aggregate 或类似的完全矢量化方式。
【问题讨论】:
-
要将您的代码从
for转换为sapply,您可以使用sapply(1:nrow(values), function(i) weighted.mean(values[i, ], weights[i, ])),但我不确定这是否比for循环更有效。 -
for循环可能会尽可能快。你可以试试matrixstats::weightedMean会更快。什么构成“大”矩阵(即多列、多行,两者都有)? -
也许是
apply(abind::abind(values, weights, along = 3), 1, function(x) weighted.mean(x[,1], x[,2]))