2013-02-11 96 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