2010-07-29 2 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를 dat로 대체했습니다 (각 자산 클래스에 대해 동일한 수를 반환). 집계 명령과 함께 작동하지 않는 이유는 무엇입니까? –

+1

'aggregate'는 모든 열을 집계하여 두 열을 넘는 계산을 원하는 것처럼 보입니다. 나는 얼마 전 doBy 나 그와 비슷한 것을 사용합니다. 그러나 이봐,'plyr'는 더 쉽게 만들고 다른 종들과 휘파람을 가지고 있습니다. –

+3

당신은 여전히'summarise'에 대해 배울 필요가 있습니다;) – hadley

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을 보았습니다. 데이터베이스가 증가함에 따라 시간이 갈 것으로 생각됩니다. 포인터를 감사하십시오! –

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

+0

가중치를 적용하는 방법에는 여러 가지가 있으며,이 경우에는 샘플의 수이므로 옳습니다. 가중치에 대해 하나 이상의 방정식이 있습니다. 더크의 데이터에서 실행 해. – John

+0

'mean() '을 사용하면 나를 혼란스럽게합니다. 그것은'sum()'일 수 있습니다; 'mean()'을 사용하면 분자와 분모를'nlevels (assetclass)'로 나눌 수 있습니다. (매우 큰 데이터 셋의 경우 평균값이 더 안정적 일 수 있습니다) –