2013-02-11 70 views
7

這裏的子集的統計數據是我的一個小數據重複的例子:計算數據

> 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 

我想生成包含measure平均爲特定主題一個新的變量,所以:

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 

有沒有一種簡單的方法來做到這一點,而不是以編程方式循環遍歷所有記錄或首先重新變形爲寬格式?

回答

14

使用基礎R功能ave(),但它的混淆名稱,可以計算各種統計數據,包括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 

請注意,我使用within只是爲了更短的代碼。這裏是不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'是不必要的,正確的嗎?這是默認的「FUN」 – 2016-02-23 18:42:41

6

您可以使用ddplyplyr包:

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

可選地與data.table包:

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