如何在R中计算加权平均数?

23

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


6
就我个人而言,我给这个内容点了踩是因为在谷歌搜索"R语言中的加权平均数"时,第一个结果就是weighted.mean函数的帮助页面。 - joran
3
悬停在你的问题旁边的投票数下方的向下三角形上。工具提示显示:“这个问题没有展示任何调研努力; ...”。由于这里已经有人问了一个非常类似的问题,可以通过搜索轻松找到,并且谷歌搜索会带你找到正确的答案,这可能是为什么你被踩和关闭问题的原因。 - Gavin Simpson
1
另一个问题似乎不同,原帖作者在接受的答案评论中澄清了他所询问的是加权方差:_> 是的,我正在寻找加权方差,而不是均值 - Alex Apr 8 '12 at 2:26 - Chris Snow
3
投票重新开放;正如@ChrisSnow所指出的那样,其他问题似乎不同,并且无论如何都比这个问题不清楚得多 - Ilmari Karonen
3个回答

40

使用 weighted.mean 函数:

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

23

看起来你已经知道如何计算这个值,只需要在实现时得到正确方向的提示。由于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

2
另一个选项是collapse::fmean,它包括一个用于权重的w参数,并且速度明显较快。
library(collapse)
fmean(z$size, w = z$count)
#[1] 4

基准测试包含10,000行数据:
# 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())

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接