r-在svychisq上使用lapply函数



我有一个名为";药物";并且我创建了一个名为";weighted_data";。

weighted_data <- svydesign(id = ~cluster, 
strata = ~strata, 
weights = ~weights, 
data = drugs, 
nest = TRUE)

我可以使用这个函数对所有变量进行卡方检验,看看有医用大麻法律的州与没有医用大麻法律州的比例是否有显著差异。

svychisq(~religion_importance + medmj_law, design=weighted_data)

当然,我不想对所有12个变量都这样做,所以我想使用lapply函数。

lapply(names(drugs[-c(1, 14:16)]), function(x)
svychisq(
as.formula(bquote(~.(as.name(x))) + medmj_law ), 
design = weighted_data))

但我一直得到"as.formula(bquote(~.(as.name(x((+medmj_law(中出错:找不到对象"medmj_law">。我的语法一定有问题。

作为参考,第一个变量是"0";medmj_ law";变量2-13是我想做卡方检验的12个分类变量。我用这个代码来计算比例,这很有效。

overall_table_weighted <- lapply(names(drugs[,-c(14:16)]), function(x)
svytable(bquote(~.(as.name(x))), design=weighted_data))
overall_prop_weighted <- lapply(names(drugs[,-c(14:16)]), function(x)
round(prop.table(svytable(bquote(~.(as.name(x))), design=weighted_data))*100, 2))

我从@benimwolfspelz的评论中得到了答案:

虽然还有其他方法(我想(,但as.formula()可以很好地使用字符串作为其第一个参数。在您的情况下,as.formula不会尝试将字符串"medmj_law"添加到公式中,而是查找具有此名称的对象。但是在传递给lapply的匿名函数的环境中没有该对象。试试这个:as.formula(paste("~", x, " + medmj_law"))

完整代码:

#Chi-Squared Tests
chisq_weighted <- lapply(names(drugs[-c(1, 14:16)]), function(x)
svychisq(as.formula(paste("~", x, " + medmj_law")), design = weighted_data))
pvalues_weighted <- lapply(names(drugs[-c(1, 14:16)]), function(x)
svychisq(as.formula(paste("~", x, " + medmj_law")), design = weighted_data)$p.value)

谢谢@benimwolfspelz!!

这很容易,只需执行以下操作:

lapply(names(drugs[-c(1, 14:16)]), function(x)
svychisq(
bquote(~.(as.name(x))+ medmj_law), 
design = weighted_data))

不客气。

最新更新