r 中的分组加权平均值(最好使用 ddply,但不管用什么)

grouped weighted mean in r (preferably with ddply but whatever works)

我有一个数据集,我想在其中按组获取正常 'mean' 和加权平均值。每个组可以被视为不同的投资组合或股票,价格是该投资组合或股票的价格,规模是股票,收益是 return 的百分比,因此市值是价格*规模。

加权平均值将是相对于各组市值的收益。我 运行 下面的代码,它显然看起来是错误的,但对于我来说,我无法弄清楚我错过了什么:

mydf= structure(list(group = structure(c(1L, 2L, 1L, 2L, 1L), .Label = c("a","b"), class = "factor"), 
                     price = c(15, 20, 10, 40, 20), size = c(100, 10, 50, 50, 1000), 
                     gain = c(0.03, 0.02, 0.05, 0.1, 0.01), wt = c(1500, 200, 500, 2000, 20000)), 
                .Names = c("group", "price", "size", "gain", "wt"), row.names = c(NA, -5L), 
                class = "data.frame")
mydf
library(plyr)
ddply(x, .(group), summarise,normal_mean= mean(gain), 
      wt_mean= weighted.mean(x$price*x$size,x$gain))

这里我将价格和尺码相乘,你也可以只使用 weighted.mean 函数中的 wt 列或者假设...

加权平均数似乎不是针对我的组计算的,而是针对所有行计算的。有帮助吗?

data.table

的方法
library(data.table)

setDT(mydf)[,list(normalMean=mean(gain), 
             weightedMean=weighted.mean(gain, wt/sum(wt))), 
             by = group]

#   group normalMean weightedMean
#1:     a       0.03   0.01227273
#2:     b       0.06   0.09272727

dplyr

的方法
mydf %>% group_by(group) %>%
summarise (mean=mean(gain), avgwt = weighted.mean(gain,wt))


  group mean      avgwt
1     a 0.03 0.01227273
2     b 0.06 0.09272727