使用调查功能从列表中调用变量的问题

问题描述

我正在使用调查功能来计算R中的卡方检验。我有一个变量列表,我想应用该函数。这是我的代码

library("survey")

#fake data 
dataset<-data.frame(id=seq(1,1000,1),expFact=round(rnorm(1000,70,4)),x=sample(c(1,2,3),replace = T),y = sample(c(1,3,4),z=sample(c(1,2),replace = T) )


dict<-c("x","y")

for (i in 1:2){
  dclus1<-svydesign(ids=~id,weights=~expFact,strata=NULL,data = dataset)
  chi_quadrad<-svychisq(~ get(dict[i])  + z,dclus1,statistic="Chisq")
  chi_quadrad
}

我得到一个错误。我认为函数不是从列表中读取变量,还有另一种方法调用变量吗?预先感谢。

解决方法

或者,您可以使用substitutebquote

dclus1<-svydesign(ids=~id,weights=~expFact,strata=NULL,data = dataset)
for(i in 1:2){
  chi_quadrad <- eval(bquote(svychisq(~.(as.name(dict[i]))+z,dclus1,statistic="Chisq")))
  print(chi_quadrad)
}

这样做的一个小好处是变量名以公式结尾(而不是dict[i]),所以您的输出为

    Pearson's X^2: Rao & Scott adjustment

data:  svychisq(~x + z,statistic = "Chisq")
X-squared = 5.0086,df = 2,p-value = 0.08268

而不是

    Pearson's X^2: Rao & Scott adjustment

data:  svychisq(as.formula(paste0("~",dict[i],"+z")),p-value = 0.08268

bquote是tidyverse使用!!!!!的unquote和unquote-and-splice的基本R版本。

,

您可以使用as.formula

从字符串构造公式
for (i in 1:2) {
  dclus1<-svydesign(ids=~id,data = dataset)
  chi_quadrad <- svychisq(as.formula(paste0("~",statistic="Chisq")
  chi_quadrad
}