Ответ 1
Используйте weighted.mean
:
> weighted.mean(z$size, z$count)
[1] 4
Как вычислить взвешенное среднее значение в 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
.
Используйте weighted.mean
:
> weighted.mean(z$size, z$count)
[1] 4
Похоже, вы уже знаете, как вычислить это, просто нужно подтолкнуть в правильном направлении, чтобы реализовать его. Так как 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