我试图按资产类别计算资产加权回报.对于我的生活,我无法弄清楚如何使用aggregate命令来做到这一点.
我的数据框看起来像这样
dat <- data.frame(company, fundname, assetclass, return, assets)
Run Code Online (Sandbox Code Playgroud)
我正在尝试做一些事情(不要复制这个,这是错的):
aggregate(dat, list(dat$assetclass), weighted.mean, w=(dat$return, dat$assets))
Run Code Online (Sandbox Code Playgroud)
Dir*_*tel 13
对于初学者来说,w=(dat$return, dat$assets))是语法错误.
而plyr使这更容易:
> set.seed(42) # fix seed so that you get the same results
> dat <- data.frame(assetclass=sample(LETTERS[1:5], 20, replace=TRUE),
+ return=rnorm(20), assets=1e7+1e7*runif(20))
> library(plyr)
> ddply(dat, .(assetclass), # so by asset class invoke following function
+ function(x) data.frame(wret=weighted.mean(x$return, x$assets)))
assetclass wret
1 A -2.27292
2 B -0.19969
3 C 0.46448
4 D -0.71354
5 E 0.55354
>
Run Code Online (Sandbox Code Playgroud)
一个data.table解决方案,将比更快plyr
library(data.table)
DT <- data.table(dat)
DT[,list(wret = weighted.mean(return,assets)),by=assetclass]
## assetclass wret
## 1: A -0.05445455
## 2: E -0.56614312
## 3: D -0.43007547
## 4: B 0.69799701
## 5: C 0.08850954
Run Code Online (Sandbox Code Playgroud)
这也可以通过聚合轻松完成.它有助于记住加权平均值的替代方程.
rw <- dat$return * dat$assets
dat1 <- aggregate(rw ~ assetclass, data = dat, sum)
datw <- aggregate(assets ~ assetclass, data = dat, sum)
dat1$weighted.return <- dat1$rw / datw$assets
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
16503 次 |
| 最近记录: |