我是R的初学者,我遇到了一个可能对你来说很简单的问题。提前谢谢,如果可以给我一些帮助。我不确定标题是否确实反映了我想问的问题。为了清楚我的问题,我将使用一个简单的例子。
假设我们的数据框包含两个因子(FE和DI)和三个变量(SR1,SR2和SR3),如:
df<-data.frame(FE=rep(c("FL","FM","FH"),4),DI=rep(c("DL","DH"),each=6),
SR1=rpois(12,10),SR2=rpois(12,15),SR3=rpois(12,20))
我知道如何使用“聚合”根据因子计算变量的均值,例如:
df.me1<-aggregate(SR1~FE,df,mean)
df.me2<-aggregate(cbind(SR1,SR2,SR3)~FE+DI,df,mean)
然后,我制作两个字符(vars和facs),由三个变量的名称和两个因素组成:
vars<-c("SR1","SR2","SR3")
facs<-c("FE","DI")
现在,我想出于某种原因在以下公式中进行计算
df.me1<-aggregate(vars[1]~facs[1],df,mean)
df.me2<-aggregate(cbind(vars[1],vars[2],vars[3])~facs[1]+facs[2],df,mean)
代码肯定不起作用,那么我该怎样做才能使它们以这种方式工作呢?
答案 0 :(得分:4)
有两种方法可以做到这一点。一个是通过aggregate
的公式界面,这是你目前正在尝试做的事情。为了使其工作,您必须创建一个包含依赖变量和自变量的字符串。然后,您将使用as.formula()
将该字符串转换为公式对象。这是过于复杂的,因为它需要很多具有sprintf
和/或paste
的巫术。
更简单的方法是通过aggregate
的{{1}}参数,这对于通过变量名进行的替换更加友好。
by
答案 1 :(得分:3)
对于处理方程式中的字符串的更通用的解决方案,我喜欢使用eval(解析(&text =&#34;要执行的字符串&#34;)),例如在代码中
eval(parse(text = paste("df.me1<-aggregate(",vars[1],"~",facs[1],",df,mean)",sep="")))
我得到以下结果
> df.me1
FE SR1
1 FH 9.75
2 FL 10.75
3 FM 10.25
我还发现在检索字符串引用的列表中的信息时该功能很有用。
这是粘贴命令
> paste("df.me1<-aggregate(",vars[1],"~",facs[1],",df,mean)",sep="")
[1] "df.me1<-aggregate(SR1~FE,df,mean)"
第二部分
eval(parse(text = paste("df.me2<-aggregate(cbind(",vars[1],",",vars[2],",",vars[3],")~",facs[1],"+",facs[2],",df,mean)",sep="")))
答案 2 :(得分:1)
@ jdobres&#39;在大多数情况下,答案更清晰,可能更好,但是如果你必须完全按照你所写的那样做,那么引用this回答,你就可以使用get()
。
df.me2<-aggregate(cbind(SR1,SR2,SR3)~FE+DI,df,mean)
df.me2.get<-aggregate(cbind(get(vars[1]),get(vars[2]),get(vars[3]))~get(facs[1])+get(facs[2]),df,mean)
检查它们是否相同:
df.me2 == df.me2.get
FE DI SR1 SR2 SR3
[1,] TRUE TRUE TRUE TRUE TRUE
[2,] TRUE TRUE TRUE TRUE TRUE
[3,] TRUE TRUE TRUE TRUE TRUE
[4,] TRUE TRUE TRUE TRUE TRUE
[5,] TRUE TRUE TRUE TRUE TRUE
[6,] TRUE TRUE TRUE TRUE TRUE