在r中分组加权平均值(最好是ddply但不管是什么工作)

时间:2015-03-31 05:57:42

标签: r statistics plyr

我有一个数据集,我想要按正常的'均值'和按组加权平均值。每组可以被视为不同的投资组合或股票,价格是该投资组合或股票的价格,大小是股票,收益是百分比的回报,因此市值将是价格*大小。

加权平均值是相对于市场上限的收益。我运行下面的代码,它显然看起来不对,但对于我的生活,我无法弄清楚我错过了什么:

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列或者假设...

加权平均值似乎不是在计算我的组而是计算所有行。有什么帮助吗?

2 个答案:

答案 0 :(得分:2)

使用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

答案 1 :(得分:1)

使用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