Мне было интересно, есть ли способ векторизовать взвешенную арифметику по матрицам. например для вычисления средневзвешенного значения 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
или подобного.
for
вsapply
, вы можете сделатьsapply(1:nrow(values), function(i) weighted.mean(values[i, ], weights[i, ]))
, но я не уверен, что это эффективнее, чем циклfor
. - person Ronak Shah   schedule 04.02.2019for
, вероятно, настолько быстр, насколько это возможно. Вы можете попробоватьmatrixstats::weightedMean
, который будет быстрее. Что представляет собой «большая» матрица (т. е. много столбцов, много строк, и то, и другое)? - person Hugh   schedule 04.02.2019apply(abind::abind(values, weights, along = 3), 1, function(x) weighted.mean(x[,1], x[,2]))
- person alistaire   schedule 04.02.2019