我試圖按資產類別計算資產加權回報。對於我的生活,我無法弄清楚如何使用聚合命令來做到這一點。R中的總計和加權平均數
我的數據幀看起來像這樣
dat <- data.frame(company, fundname, assetclass, return, assets)
我試圖做這樣的事情(不要複製此,它是錯的):
aggregate(dat, list(dat$assetclass), weighted.mean, w=(dat$return, dat$assets))
我試圖按資產類別計算資產加權回報。對於我的生活,我無法弄清楚如何使用聚合命令來做到這一點。R中的總計和加權平均數
我的數據幀看起來像這樣
dat <- data.frame(company, fundname, assetclass, return, assets)
我試圖做這樣的事情(不要複製此,它是錯的):
aggregate(dat, list(dat$assetclass), weighted.mean, w=(dat$return, dat$assets))
對於初學者來說,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
>
一個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
我一直在尋找data.table一段時間的意思。隨着數據庫的增長,我想這是時間。欣賞指針! – 2012-09-10 18:12:44
這也很容易與集合的方式進行。它有助於記住加權平均的替代方程。
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
等一下,這沒有任何意義。你基本上將平均數除以平均樣本數。加權平均值是加權值的*總和*除以權重的總和* – theforestecologist 2016-01-25 21:39:41
有多種權重方法,在這種情況下,它是樣本數量,因此它是正確的。有多個加權等式。在Dirk的數據上運行它。 – John 2016-01-25 21:53:46
「mean()」的使用使我困惑。它可能是'sum()';使用'mean()'意味着我們用「nlevels(資產類)」來劃分分子和分母(對於非常大的數據集,儘管平均值可能在數值上更穩定) – 2017-11-30 01:15:34
它像一個魅力。第一次嘗試時,我用函數替換了函數中的x(每個資產類別返回相同的數字)。 任何想法,爲什麼這不會使用聚合命令? – 2010-07-30 05:01:20
看來'聚合'聚集了每一列,你希望計算兩列。我想前一陣子我用'doBy'或類似的東西 - 但是,嘿,'plyr'使它更容易,還有其他的花裏胡哨的東西。 – 2010-07-30 11:38:44
你仍然需要了解'summarise';) – hadley 2010-07-30 17:32:22