使用循环时的子集错误

时间:2017-03-21 00:52:41

标签: r loops subset glm survey

我一直在使用这个公式:

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不会执行此操作并包含整个数据框。

关于为什么会发生这种情况以及如何解决这个问题的任何指示都非常感谢!

2 个答案:

答案 0 :(得分:1)

svyglm有一个子集参数,因此您无需在设计对象上调用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)))
}

答案 1 :(得分:0)

subset()使用非标准评估,这意味着它将列名称作为不带引号的变量,例如。

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

VS

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

您的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(,那么可能会出现问题。