我有我担心的可能是一个简单的问题,我几乎有解决方案(事实上,我确实有一个解决方案,但它很笨拙)。
我的数据框如下:
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中只有一次重复时它将起作用。是否有一个更一般的一线解决方案?
提前感谢大家的帮助。
答案 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]