计算数据子集的统计信息
这是我的数据的一个小的可重复的例子:
> 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