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

R 如何计算因子水平内向量的加权平均值?,r,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

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

> 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的加权平均值,在factor 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

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

我用一些虚拟数据重新创建了错误。我假设
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

您的问题是,
tapply
没有像对主参数
X
那样,将提供给函数的额外参数(通过其
..
参数)“拆分”。有关
tapply
?tapply
)的信息,请参见帮助页面上的“注意事项”

由提供的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]])
})
exp.f现在我这样做(感谢加文):

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

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

Hi-jonw-exp.f是股票预期收益的数字向量,部分f.p.d是一个10级因子,b.pct是指数中每只股票的百分比(前1000只股票)请参阅的答案。谢谢-是否有一些调整可以使计算加权。你知道的平均值?@Prasad:我知道强制性plyr解决方案将获得一些选票。;-)谢谢-我知道我需要投入一些时间来学习plyr的全部内容。干杯。@Joshua the
do.call
在这里有点过分了<代码>SAPPY(分割(数据,数据$part.f.p.d),函数(x)加权平均值(x$exp.f,x$b.pct))
足以返回加权平均值向量。
split
方法(+1)的简单性被
rbind
+
do.call
wrapping隐藏了起来。为什么plyr会喜欢?;-)我同意这是一个非常好的软件包,但是像Q中提出的这样的简单问题可以通过基本的R功能很好地处理,而不需要学习新的软件包。@Gavin:
do.call(rbind,…)
东西只是处理更一般问题的习惯。你说得对,在这种情况下,
sapply
更好。
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]])
})
sapply(split(Data,Data$part.f.p.d), function(x) weighted.mean(x$exp.f,x$b.pct)))
ddply(Data, "part.f.p.d", function(x) weighted.mean(x$exp.f, x$b.pct))