2010-07-29 104 views
11

我試圖按資產類別計算資產加權回報。對於我的生活,我無法弄清楚如何使用聚合命令來做到這一點。R中的總計和加權平均數

我的數據幀看起來像這樣

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

我試圖做這樣的事情(不要複製此,它是錯的):

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

回答

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 
> 
+0

它像一個魅力。第一次嘗試時,我用函數替換了函數中的x(每個資產類別返回相同的數字)。 任何想法,爲什麼這不會使用聚合命令? – 2010-07-30 05:01:20

+1

看來'聚合'聚集了每一列,你希望計算兩列。我想前一陣子我用'doBy'或類似的東西 - 但是,嘿,'plyr'使它更容易,還有其他的花裏胡哨的東西。 – 2010-07-30 11:38:44

+3

你仍然需要了解'summarise';) – hadley 2010-07-30 17:32:22

8

一個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 
+0

我一直在尋找data.table一段時間的意思。隨着數據庫的增長,我想這是時間。欣賞指針! – 2012-09-10 18:12:44

5

這也很容易與集合的方式進行。它有助於記住加權平均的替代方程。

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 
+1

等一下,這沒有任何意義。你基本上將平均數除以平均樣本數。加權平均值是加權值的*總和*除以權重的總和* – theforestecologist 2016-01-25 21:39:41

+0

有多種權重方法,在這種情況下,它是樣本數量,因此它是正確的。有多個加權等式。在Dirk的數據上運行它。 – John 2016-01-25 21:53:46

+0

「mean()」的使用使我困惑。它可能是'sum()';使用'mean()'意味着我們用「nlevels(資產類)」來劃分分子和分母(對於非常大的數據集,儘管平均值可能在數值上更穩定) – 2017-11-30 01:15:34