【问题标题】:Subset error when using a loop使用循环时出现子集错误
【发布时间】:2017-03-21 00:52:41
【问题描述】:

我一直在用这个公式:

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 不会这样做,而是包含整个数据框。

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

【问题讨论】:

  • 不鼓励在函数和循环中使用subset(参考:adv-r.had.co.nz/Subsetting.html)。改用dplyrfilter 或类似的东西。
  • 使用glm的子集参数。下面会给出答案
  • @discipulus dplyr 不容易与library(survey) 一起使用
  • @RichScriven 我认为语法不适用于FEI.w?该对象的类是某种调查设计
  • @AnthonyDamico 是对的。我尝试了 Rich Scriven 建议的合成器,但没有奏效。另外,我认为 dplyr 不起作用,因为 FEI.w 不完全是数据框,而是调查包创建的调查对象。它的非传统数据框是我一直难以找到简单数据操作命令的简单解决方案的部分原因。

标签: r loops subset glm survey


【解决方案1】:

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

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

【讨论】:

  • 非常感谢! eval(parse( 修复了所有问题。我阅读了其他一些关于使用 dplyr 和使用循环以外的东西的 cmets。我将来会尝试这样做,但这行得通!你是救生员。
  • 如果这回答了您的问题,请考虑接受它。
【解决方案2】:

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)))
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-27
    • 2017-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-26
    相关资源
    最近更新 更多