如何在因子水平内计算向量的加权平均值?

时间:2011-02-01 18:29:01

标签: r

我能够在因子水平内成功获得给定向量的简单均值,但在尝试将其用于加权观察的下一步时,我无法使其工作。这有效:

> tapply(exp.f,part.f.p.d,mean)
    1         2         3         4         5         6         7        8             9        10 
0.8535996 1.1256058 0.6968142 1.4346451 0.8136110 1.2006801 1.6112160 1.9168835     1.5135006 3.0312460 

但这不是:

> tapply(exp.f,part.f.p.d,weighted.mean,b.pct)
Error in weighted.mean.default(X[[1L]], ...) : 
  'x' and 'w' must have the same length
> 

在下面的代码中,我试图找到exp.f的加权平均值,在因子part.f.p.d的水平内,由b.pct中每个级别的观察值加权。

b.exp <- tapply(exp.f,part.f.p.d,weighted.mean,b.pct)

Error in weighted.mean.default(X[[1L]], ...) : 
  'x' and 'w' must have the same length

我在想我必须提供错误的语法,因为所有这三个向量都是相同的长度:

> length(b.pct)
[1] 978
> length(exp.f)
[1] 978
> length(part.f.p.d)
[1] 978

这样做的正确方法是什么?提前谢谢。

3 个答案:

答案 0 :(得分:8)

现在我这样做(感谢Gavin):

sapply(split(Data,Data$part.f.p.d), function(x) weighted.mean(x$exp.f,x$b.pct)))

其他人可能会使用plyr包中的ddply

ddply(Data, "part.f.p.d", function(x) weighted.mean(x$exp.f, x$b.pct))

答案 1 :(得分:2)

我用一些虚拟数据重新创建了错误。我假设part.f.p.d是你用来分隔其他向量的某种因素。

b.pct <- sample(1:100, 10) / 100
exp.f <- sample(1:1000, 10)
part.f.p.d <- factor(rep(letters[1:5], 2))

tapply(exp.f, part.f.p.d, mean) # this works
tapply(exp.f, part.f.p.d, weighted.mean, w = b.pct) # this doesn't

致电traceback()有助于发现问题。第二个不起作用的原因是因为传递给INDEX的{​​{1}}参数(即part.f.p.d)用于分割tapply()参数(即{{1转换成较小的向量。这些拆分中的每一个都与X参数一起应用于exp.f(即weighted.mean()),这些参数未被拆分。

编辑:这应该做你想要的。

w

答案 2 :(得分:2)

你的问题是tapply不会将提供的额外参数(通过其...参数)“拆分”到函数中,就像它对主参数X一样。请参阅tapply?tapply)帮助页面上的“注意”。

  

由FUN提供的FUN的可选参数   ......论点不分   细胞。因此不合适   为了乐趣,期待更多的争论   与X相同的长度。

这是一个hacky解决方案。

exp.f <- rnorm(10)
part.f.p.d <- factor(sample(1:5, size = 10, replace = T))
b.pct <- rnorm(10)
a <- split(exp.f, part.f.p.d)
b <- split(b.pct, part.f.p.d)
lapply(seq_along(a), function(i){
  weighted.mean(a[[i]], b[[i]])
})