按 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
中的mutate
或data.table
中的:=
,可以得到结果
即
library(dplyr)
group_by(test, name) %>%
mutate(meanbyname=mean(value))
或者
library(data.table)
setDT(test)[, meanbyname:= mean(value), by=name]
我担心可能是一个简单的问题,但我几乎已经找到了解决方案(事实上,我确实有解决方案,但它很笨拙)。
我有一个数据框如下:
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
中的mutate
或data.table
中的:=
,可以得到结果
即
library(dplyr)
group_by(test, name) %>%
mutate(meanbyname=mean(value))
或者
library(data.table)
setDT(test)[, meanbyname:= mean(value), by=name]