2017-03-21 4 views
1

を使用しているとき、私は、この式を使用している:サブセットエラーループ

varlist <- c("A", "B") 

for(i in c(1:2)) { 
    print(varlist[i]) 
    print(summary(svyglm(as.formula(paste0(varlist[i], "~YEAR + REGION")), 
      design = subset(FEI.w, varlist[i] != "U"), 
      family = quasibinomial))) 

} 

を私はAとBよりも多くの変数がありますが、私は私としてAとBを使用して調査パッケージでGLMをしたいです従属変数。

私が取り組んでいる問題は、AとBの未知の値を除外するためにデータをサブセット化すると、Rはそれを実行せず、データフレーム全体を含むことです。

これがなぜ起こっているのか、どのようにこれを修正するのかについての説明は非常に高く評価されます。

+0

使用をし、推奨されてループ:あなたはこのようなサブセット化を行う必要があります(参考文献:http://adv-r.had.co.nz/Subsetting.html)。代わりに 'dplyr'の' filter'か同等のものを使用してください。 – discipulus

+0

'glm'のサブセットパラメータを使用します。答えは – Carl

+0

です@discipulus 'dplyr'は' library(survey) 'で簡単には動作しません –

答えて

0

subset()は非標準評価を使用しています。つまり、列名は引用符で囲まれていない変数(例:

subset(mtcars, "mpg" == 21) 
#> [1] mpg cyl disp hp drat wt qsec vs am gear carb 
#> <0 rows> (or 0-length row.names) 

subset(mtcars, mpg == 21) 
#>    mpg cyl disp hp drat wt qsec vs am gear carb 
#> Mazda RX4  21 6 160 110 3.9 2.620 16.46 0 1 4 4 
#> Mazda RX4 Wag 21 6 160 110 3.9 2.875 17.02 0 1 4 4 

あなたvarlist[i] != "U"はリテラル文字列"A""U"を比較し、両者が等しくないことを発見します。あなたは

eval(parse(text = varlist[i])) != "U" 

すなわち

subset(mtcars, eval(parse(text="mpg")) == 21) 
#>    mpg cyl disp hp drat wt qsec vs am gear carb 
#> Mazda RX4  21 6 160 110 3.9 2.620 16.46 0 1 4 4 
#> Mazda RX4 Wag 21 6 160 110 3.9 2.875 17.02 0 1 4 4 

が、古い格言でこの問題を回避することができるかもしれない

あなたがeval(parse(を使用しているならば、何かがおそらく間違っていることになります。

+0

ありがとうございました!私はdplyrを使用してループ以外の何かを使うことについての他のコメントをいくつか読んでいますが、将来これを試してみますが、これはうまくいきます!あなたは命を救う人です –

+0

これがあなたの質問に答えるならば、 –

+0

遅れて申し訳ありません! –

1

svyglmにはサブセットパラメータがありますので、デザインオブジェクトでsubsetを呼び出す必要はありません。関数でsubset` `の

library(survey) 
data(api) 

dstrat<-svydesign(id=~1,strata=~stype, weights=~pw, data=apistrat, fpc=~fpc) 

rstrat<-as.svrepdesign(dstrat) 

for (type in unique(apistrat$stype)) { 
    print(summary(svyglm(api00~ell+meals+mobility, 
         design = rstrat, 
         subset = apistrat$stype==type))) 
} 
+0

ああああ!私はこれが存在することを知らなかった!ありがとう! –