在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
。
在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
collapse::fmean
,它包括一个用于权重的w
参数,并且速度明显较快。library(collapse)
fmean(z$size, w = z$count)
#[1] 4
# Unit: microseconds
# expr min lq mean median uq max neval
# builtin() 165.801 239.401 257.67796 246.9515 263.2015 508.201 100
# rollyourown() 45.501 73.701 81.57205 75.7510 79.7010 196.000 100
# collapse() 26.301 27.901 32.51103 28.7510 30.7510 122.801 100
基准测试代码:
library(collapse)
z = data.frame(count = rnorm(10000), size = runif(10000))
collapse <- function() fmean(z$size, w = z$count)
builtin <- function() with(z, weighted.mean(count, size))
rollyourown <- function() with(z, sum(count*size)/sum(count))
microbenchmark(builtin(), rollyourown(), collapse())