我刚刚遇到了一个问题,在方差分析术语中使用变量。通常我会在术语中直接使用"AGE",但是在循环中运行它,所以myvar会改变。
myvar=as.name("AGE")
x=summary( aov (dat ~ contrasts*myvar)+ Error(ID/(contrasts)), data =set))
names(set) = "contrasts" "AGE" "ID" "dat"
就像我想选择:
set$myvar
- 不是功能!但
set$AGE
是
这有什么代码吗?
您需要创建模型公式的字符串表示形式,然后使用as.formula
对其进行转换。
myvar <- "AGE"
f <- as.formula(paste("dat ~", myvar))
aov(f)
正如Richie所写,粘贴似乎是最简单的解决方案。下面是一个更完整的例子:
myvar <- "AGE"
f <- as.formula(paste("dat ~ contrasts *", myvar, "+ Error(ID/contrasts)"))
x <- summary( aov(f, data=set) )
…用
代替set$myvar
set[[myvar]]
一个更高级的答案是,公式实际上是对"~"操作符的调用。您可以直接修改调用,这样在循环内会稍微有效一些:
> f <- dat ~ contrasts * PLACEHOLDER + Error(ID/contrasts) # outside loop
> f[[3]][[2]][[3]] <- as.name(myvar) # inside loop
> f # see what it looks like...
dat ~ contrasts * AGE + Error(ID/contrasts)
magic[[3]][[2]][[3]]指定要替换的公式部分。该公式实际上看起来像这样(一个解析树):
`~`(dat, `+`(`*`(contrasts, PLACEHOLDER), Error(`/`(ID, contrasts))
尝试索引公式,你就会明白:
> f[[3]]
contrasts * AGE + Error(ID/contrasts)
> f[[3]][[2]]
contrasts * AGE
UPDATE:这样做的好处是什么?当然,它更健壮—特别是如果您不控制数据的列名。如果myvar <- "AGE GROUP"
,当前的膏状溶液不起作用。如果myvar <- "file.create('~/OWNED')"
,你有严重的安全风险…