2010-07-29 77 views
11

Tôi đang cố gắng tính toán lợi nhuận theo trọng số theo loại nội dung. Đối với cuộc sống của tôi, tôi không thể tìm ra cách để làm điều đó bằng cách sử dụng lệnh tổng hợp.Tổng hợp và có trọng số trung bình trong R

khung dữ liệu của tôi trông như thế này

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

Tôi đang cố gắng để làm một cái gì đó tương tự (không sao chép này, đó là sai):

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

Trả lời

13

Đối với người mới bắt đầu, w=(dat$return, dat$assets)) là một cú pháp lỗi.

plyr làm này dễ dàng hơn một chút:

> 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

Nó hoạt động như một sự quyến rũ. Lần đầu tiên tôi thử nó, tôi đã thay thế x trong hàm bằng dat (trả về cùng một số cho mỗi lớp nội dung). Bất kỳ ý tưởng nào tại sao điều này sẽ không hoạt động với lệnh tổng hợp? –

+1

Có vẻ như 'aggregate' tổng hợp mọi cột mà bạn mong muốn tính toán qua hai cột. Tôi nghĩ một lúc trước tôi dùng 'doBy' hoặc một cái gì đó giống như nó - nhưng hey,' plyr' làm cho nó dễ dàng hơn và có các chuông và còi khác. –

+3

Bạn vẫn cần phải tìm hiểu về 'tóm tắt';) – hadley

8

Một giải pháp data.table, sẽ nhanh hơn so với 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

Tôi đã có ý nghĩa để xem dữ liệu. Có thể một thời gian ngay bây giờ. Với cơ sở dữ liệu ngày càng tăng, tôi đoán đã đến lúc rồi. Đánh giá cao con trỏ! –

5

này cũng có thể dễ dàng thực hiện với tổng hợp. Nó giúp nhớ phương trình thay thế cho một trung bình có trọng số.

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

đợi một giây, điều này không có ý nghĩa. Về cơ bản, bạn phân chia giá trị trung bình của số mẫu trung bình. Giá trị trung bình có trọng số là * tổng * của các giá trị có trọng số chia cho * tổng * trọng số – theforestecologist

+0

Có nhiều cách để làm trọng số và trong trường hợp này, đó là số lượng mẫu sao cho đúng. Có nhiều phương trình để tính trọng số. Chạy nó trên dữ liệu của Dirk. – John

+0

Việc sử dụng 'mean()' làm tôi bối rối ở đây. Nó có thể là 'sum()'; sử dụng 'mean()' ngụ ý rằng chúng ta đang chia tử số và mẫu số cho 'nlevels (assetclass)' (đối với các tập dữ liệu rất lớn, trung bình có thể ổn định về số) –

Các vấn đề liên quan