使用调查函数从列表中调用变量的问题
Problems with calling a variable from a list using survey function
我正在使用调查函数计算 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),1000, replace = T),
y = sample(c(1,2,3,4),1000, replace = T),
z=sample(c(1,2),1000, 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
}
我收到一个错误。我认为该函数不是从列表中读取变量,还有另一种调用变量的方法吗?提前致谢。
您可以使用 as.formula
从字符串构造公式
for (i in 1:2) {
dclus1<-svydesign(ids=~id, weights=~expFact, strata=NULL, data = dataset)
chi_quadrad <- svychisq(as.formula(paste0("~", 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, dclus1, 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")), dclus1, statistic = "Chisq")
X-squared = 5.0086, df = 2, p-value = 0.08268
bquote
是 unquote 的基本 R 版本和 tidyverse 使用 !!
和 !!!
的 unquote-and-splice。
我正在使用调查函数计算 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),1000, replace = T),
y = sample(c(1,2,3,4),1000, replace = T),
z=sample(c(1,2),1000, 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
}
我收到一个错误。我认为该函数不是从列表中读取变量,还有另一种调用变量的方法吗?提前致谢。
您可以使用 as.formula
for (i in 1:2) {
dclus1<-svydesign(ids=~id, weights=~expFact, strata=NULL, data = dataset)
chi_quadrad <- svychisq(as.formula(paste0("~", 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, dclus1, 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")), dclus1, statistic = "Chisq")
X-squared = 5.0086, df = 2, p-value = 0.08268
bquote
是 unquote 的基本 R 版本和 tidyverse 使用 !!
和 !!!
的 unquote-and-splice。