2012-03-25 5 views
5

У меня есть следующие данные:Взвешенное среднее по ряду

a=c(1:10) 
b=c(16:25) 
c=c(24:33) 
wa=c(3,7,3,3,3,3,3,3,3,1) 
wb=c(3,2,3,3,3,3,3,3,3,8) 
wc=c(4,1,4,4,4,4,4,4,4,1) 
z=data.frame(a,b,c,wa,wb,wc) 

Я хочу, чтобы получить взвешенное среднее для каждой записи. Так что я попытался это:

weight=apply(subset(z,select=c(wa,wb,wc)),1,function(x) x) 
z$weightMean=apply(subset(z,select=c(a,b,c)),1,function(x) weighted.mean(x,weight)) 

Который возвращается следующее сообщение об ошибке:

Error in weighted.mean.default(x, weight) : 
    'x' and 'w' must have the same length 

Итак, я попытался это:

weight=as.vector(weight) 
z$weightMean=apply(subset(z,select=c(a,b,c)),1,function(x) weighted.mean(x,weight)) 

Который также вернулся и ту же ошибку.

Что я делаю неправильно?

ответ

3

Это, кажется, сделать трюк:

> apply(z, 1, function(x) weighted.mean(x[1:3], x[4:6])) 
[1] 14.7 7.3 16.7 17.7 18.7 19.7 20.7 21.7 22.7 24.3 

Это, вероятно, будет немного быстрее, хотя и менее ясно, что происходит:

> rowSums(z[,1:3] * z[,4:6])/rowSums(z[,4:6]) 
[1] 14.7 7.3 16.7 17.7 18.7 19.7 20.7 21.7 22.7 24.3 
+0

Только первый метод может иметь дело со значениями NA , используя 'weighted.mean (..., na.rm = T)'. Второй метод возвращает NA, как только один из столбцов содержит NA. – Martin

+0

@Martin - 'rowSums()' поддерживает аргумент 'na.rm', поэтому он должен работать и для этого. – Chase

Смежные вопросы