我有一个数据集,我想要按正常的'均值'和按组加权平均值。每组可以被视为不同的投资组合或股票,价格是该投资组合或股票的价格,大小是股票,收益是百分比的回报,因此市值将是价格*大小。
加权平均值是相对于市场上限的收益。我运行下面的代码,它显然看起来不对,但对于我的生活,我无法弄清楚我错过了什么:
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列或者假设...
加权平均值似乎不是在计算我的组而是计算所有行。有什么帮助吗?
答案 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