计算数据子集的统计信息

这是我的数据的一个小的可重复的例子:

> 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 

我想生成一个新的variables,其中包含该特定主题的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 

有没有一个简单的方法来做到这一点,而不是以编程方式循环遍历所有logging或首先重新变成宽格式?

使用基本的R函数ave() ,尽pipe名称混乱,它可以计算各种统计数据,包括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()的等价物:

 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 

另外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 

您可以使用plyr软件包中的plyr

 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