3

anova用語で変数を使用するときに問題が発生しました。通常、用語の中で「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はい

これのためのコードはありますか?

4

2 に答える 2

4

モデル式の文字列表現を作成し、 を使用して変換する必要がありますas.formula

myvar <- "AGE"
f <- as.formula(paste("dat ~", myvar))
aov(f)
于 2011-07-07T13:18:56.503 に答える
1

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)

マジック [[3]][[2]][[3]] は、置換する数式の部分を指定します。数式は実際には次のようになります (解析ツリー)。

`~`(dat, `+`(`*`(contrasts, PLACEHOLDER), Error(`/`(ID, contrasts))

式の索引付けをいじってみると、次のことが理解できます。

> f[[3]] 
contrasts * AGE + Error(ID/contrasts) 
> f[[3]][[2]] 
contrasts * AGE 

更新:これにはどのような利点がありますか? 特に、データの列名を制御しない場合は、より堅牢です。myvar <- "AGE GROUP"現在の貼り付けソリューションが機能しない場合。そしてmyvar <- "file.create('~/OWNED')"、深刻なセキュリティ上のリスクがある場合...

于 2011-07-07T15:08:11.603 に答える