Как вычислить средневзвешенное значение в R?

Как вычислить взвешенное среднее значение в R?

Например, у меня есть 4 элемента, из которых 1 элемент имеет размер (или: длина, ширина и т.д.). 10 и 3 элемента имеют размер 2.

> z = data.frame(count=c(1,3), size=c(10,2))
> z
  count size
1     1   10
2     3    2

Средневзвешенное значение (10 * 1 + 2 * 3)/4 = 4.

Ответ 1

Используйте weighted.mean:

> weighted.mean(z$size, z$count)
[1] 4

Ответ 2

Похоже, вы уже знаете, как вычислить это, просто нужно подтолкнуть в правильном направлении, чтобы реализовать его. Так как R векторизован, это довольно просто:

with(z, sum(count*size)/sum(count))

with немного просто экономит на типизации и эквивалентна sum(z$count*z$size)/sum(z$count)

Или используйте встроенную функцию weighted.mean() как вы также указали. Использование вашей собственной функции может оказаться более быстрым, хотя не будет делать то же количество ошибок, что и встроенная функция.

builtin <- function() with(z, weighted.mean(count, size))
rollyourown <- function() with(z, sum(count*size)/sum(count))

require(rbenchmark)  
  benchmark(builtin(), rollyourown(),
            replications = 1000000,
            columns = c("test", "elapsed", "relative"),
            order = "relative")
#-----
           test elapsed relative
2 rollyourown()   13.26 1.000000
1     builtin()   22.84 1.722474