如何计算R中的加权平均值?

问题描述 投票:0回答:3

如何计算

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 mean weighted-average
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

3
投票

另一个选项是

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())
© www.soinside.com 2019 - 2024. All rights reserved.