按 R 中的因子水平表示,追加为新列

Mean by levels of factor in R, append as new column

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

我有一个数据框如下:

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' 计算 'value' 的平均值,并将结果附加到新列中,如下所示:

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)

我想要一种自动化流程的方法,这样它就可以工作,例如,三个 name=A 的副本和只有一个 name=B 的副本。能否有一种更通用的单行解决方案?

提前感谢大家的帮助。

您可以使用 base R

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

或者使用dplyr中的mutatedata.table中的:=,可以得到结果

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

或者

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