跨矩阵向量化加权算法

时间:2019-02-04 04:28:00

标签: r weighted

我想知道是否有任何方法可以对矩阵中的加权算术进行矢量化处理。例如计算给定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或类似名称的完全矢量化方式。

2 个答案:

答案 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的确是岩石!