数据结构- R中的方差分析:数据框选择



我刚刚遇到了一个问题,在方差分析术语中使用变量。通常我会在术语中直接使用"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')",你有严重的安全风险…

最新更新