2013-02-11 28 views
7

Dưới đây là một ví dụ tái sản xuất nhỏ dữ liệu của tôi:Tính toán thống kê về các tập con của dữ liệu

> mydata <- structure(list(subject = c(1, 1, 1, 2, 2, 2), time = c(0, 1, 2, 0, 1, 2), measure = c(10, 12, 8, 7, 0, 0)), .Names = c("subject", "time", "measure"), row.names = c(NA, -6L), class = "data.frame") 

> mydata 

subject time measure 
1   0  10 
1   1  12 
1   2  8 
2   0  7 
2   1  0 
2   2  0 

Tôi muốn tạo ra một biến mới có chứa giá trị trung bình của measure cho rằng vấn đề cụ thể, vì vậy:

subject time measure mn_measure 
1   0  10  10 
1   1  12  10 
1   2  8  10 
2   0  7  2.333 
2   1  0  2.333 
2   2  0  2.333 

Có cách nào dễ dàng để thực hiện việc này, ngoài việc lặp qua tất cả các bản ghi có lập trình hoặc định dạng lại thành định dạng rộng đầu tiên không?

Trả lời

14

Sử dụng các chức năng cơ sở R ave(), mà mặc dù tên khó hiểu của nó, có thể tính toán nhiều số liệu thống kê, trong đó có mean:

within(mydata, mean<-ave(measure, subject, FUN=mean)) 

    subject time measure  mean 
1  1 0  10 10.000000 
2  1 1  12 10.000000 
3  1 2  8 10.000000 
4  2 0  7 2.333333 
5  2 1  0 2.333333 
6  2 2  0 2.333333 

Lưu ý rằng tôi sử dụng within chỉ vì lợi ích của mã ngắn hơn. Dưới đây là tương đương mà không within():

mydata$mean <- ave(mydata$measure, mydata$subject, FUN=mean) 
mydata 
    subject time measure  mean 
1  1 0  10 10.000000 
2  1 1  12 10.000000 
3  1 2  8 10.000000 
4  2 0  7 2.333333 
5  2 1  0 2.333333 
6  2 2  0 2.333333 
+0

'FUN = mean' là không cần thiết, có đúng không? Đó là mặc định 'FUN' –

6

Bạn có thể sử dụng ddply từ plyr gói:

library(plyr) 
res = ddply(mydata, .(subject), mutate, mn_measure = mean(measure)) 
res 
    subject time measure mn_measure 
1  1 0  10 10.000000 
2  1 1  12 10.000000 
3  1 2  8 10.000000 
4  2 0  7 2.333333 
5  2 1  0 2.333333 
6  2 2  0 2.333333 
9

Ngoài ra với data.table gói:

require(data.table) 
dt <- data.table(mydata, key = "subject") 
dt[, mn_measure := mean(measure), by = subject] 

# subject time measure mn_measure 
# 1:  1 0  10 10.000000 
# 2:  1 1  12 10.000000 
# 3:  1 2  8 10.000000 
# 4:  2 0  7 2.333333 
# 5:  2 1  0 2.333333 
# 6:  2 2  0 2.333333 
Các vấn đề liên quan