2011-02-01 49 views
3

我能够在因子水平内成功得到一个给定向量的简单平均值,但是在试图将其加权到下一步对观测值加权时,我无法使其工作。这工作:如何在因子水平内计算矢量的加权平均值?

> 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.fpd的水平之内,通过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 

我想我必须提供不正确的语法,因为这些载体的所有3的长度相同:

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

什么是做这种正确的方法是什么?先谢谢你。

+0

嗨jonw- exp.f是股票预期收益的数字矢量,part.fpd是10个水平的因子,b.pct是指数(前1000名股票)中每只股票的百分比 – user297400 2011-02-01 18:47:09

+0

查看http:/ /堆栈溢出。COM /问题/ 3685492/R-加速部分组按操作。 – Charles 2011-02-01 18:51:58

回答

8

现在我做这样的(感谢加文):

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

其他可能使用ddply从plyr包:

ddply(Data, "part.f.p.d", function(x) weighted.mean(x$exp.f, x$b.pct)) 
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()有助于发现问题。第二个不起作用的原因是因为您传递给tapply()INDEX参数(即part.f.p.d)用于将X参数(即exp.f)分成更小的向量。这些拆分中的每一个都应用于weighted.mean()以及w参数(即b.pct),该参数未拆分。

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

sapply(levels(part.f.p.d), 
     function(whichpart) weighted.mean(x = exp.f[part.f.p.d == whichpart], 
             w = b.pct[part.f.p.d == whichpart])) 
+0

谢谢 - 是否有一些调整,这将使这项工作来计算一个weighted.mean,你知道的? – user297400 2011-02-01 18:47:40

+0

+1解释错误 – 2011-02-01 20:08:34

2

您的问题是tapply没有“分裂”提供额外的参数(通过其...参数)的功能,因为它的主要论点X。请参阅tapply?tapply)帮助页面上的'注意'。

由 参数提供的FUN的可选参数不会被分成 单元格。因此,不适当的 为FUN期望附加参数 具有相同的长度X.

这里是一个哈克溶液。

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]]) 
})