R中的因子水平的平均值,作为新列附加

时间:2015-02-20 10:01:56

标签: r apply mean

我有我担心的可能是一个简单的问题,我几乎有解决方案(事实上,我确实有一个解决方案,但它很笨拙)。

我的数据框如下:

name    replicate   value
A   1   0.9
A   2   1
B   1   0.8
B   2   0.81
C   1   0.7
C   2   0.9

我想要做的是通过“名称”计算“值”的平均值,并将结果附加到新列,如下所示:

name    replicate   value   meanbyname
A   1   0.9 0.95
A   2   1   0.95
B   1   0.8 0.805
B   2   0.81    0.805
C   1   0.7 0.8
C   2   0.9 0.8

我可以通过以下任何一种方式计算方法:

a<-aggregate(value~name, data=test, FUN=function(x) c(mean=mean(x),count=length(x)))
b<-aggregate(test$value~test$name, FUN=mean)
c<-tapply(test$value, test$name, mean)

但我不能轻易地将它们附加到数据框中,因为它们的长度不正确。

我可以这样做:

 test$meanbyname<-rep(c, each=2)

这似乎很接近,因为对象'a'似乎只有两列宽,所以给出错误:

  test$meanbyname<-rep(a$value.mean, each=a$value.count)

我想要一种自动化过程的方法,以便在有例如名称= A的三次重复且名称= B中只有一次重复时它将起作用。是否有一个更一般的一线解决方案?

提前感谢大家的帮助。

1 个答案:

答案 0 :(得分:1)

您可以使用ave

中的base R
 test$meanbyname <- with(test, ave(value, name))

或者使用mutate中的dplyr:=中的data.table,可以获得结果

 library(dplyr)
 group_by(test, name) %>% 
               mutate(meanbyname=mean(value))

或者

 library(data.table)
 setDT(test)[, meanbyname:= mean(value), by=name]