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
我有一个数据集,我想在其中按组获取正常 '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