Совокупное и взвешенное среднее в R - PullRequest
12 голосов
/ 30 июля 2010

Я пытаюсь рассчитать взвешенную доходность активов по классам активов.Что касается меня, я не могу понять, как это сделать, используя команду aggregate.

Мой фрейм данных выглядит следующим образом

dat <- data.frame(company, fundname, assetclass, return, assets)

Я пытаюсь сделать что-то вроде (не копируйте это, это неправильно):

aggregate(dat, list(dat$assetclass), weighted.mean, w=(dat$return, dat$assets))

Ответы [ 3 ]

13 голосов
/ 30 июля 2010

Для начала, 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
> 
8 голосов
/ 10 сентября 2012

A 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
6 голосов
/ 31 марта 2015

Это также легко сделать с заполнителем. Это помогает запомнить альтернативные уравнения для взвешенного среднего.

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
...