问题描述
我正在使用调查功能来计算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
}
我得到一个错误。我认为函数不是从列表中读取变量,还有另一种方法来调用变量吗?预先感谢。
解决方法
或者,您可以使用substitute
或bquote
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
}