在R中生成aff与变量列表的列联表并做卡方检验报错的解决方法
修复R语言卡方检验代码的错误
首先,咱们来分析你遇到的unique() applies only to vectors错误:问题出在你用substitute(data$i, list(i = as.name(x)))提取数据列的方式上——substitute在这里并没有真正从data中取出对应的向量,而是生成了一个表达式对象,table()函数没法处理这种对象,自然就报错了。
下面给你两种简单的修复方案,都是直接正确提取数据列的向量:
方案一:使用双中括号提取列(最推荐)
直接用data[[x]]来获取data中对应x列的向量,这是R中提取字符串对应列的标准方式:
name <- names(data) varlist <- name[11:40] models <- lapply(varlist, function(x) { chisq.test(table(data[[x]], data$aff)) }) # 查看结果的话,直接打印models或者用lapply(models, print),summary其实没必要,chisq.test的结果直接看就行 lapply(models, print)
方案二:使用with()+get()提取列
如果习惯用with简化代码,可以结合get()函数在data的环境中提取列:
name <- names(data) varlist <- name[11:40] models <- lapply(varlist, function(x) { with(data, chisq.test(table(get(x), aff))) }) lapply(models, print)
验证小技巧
在运行完整代码前,你可以先单独测试某一个变量的列联表是否正确生成,比如:
table(data[[varlist[1]]], data$aff)
如果这个能输出正常的列联表,说明提取方式没问题,再运行lapply就不会报错了。
内容的提问来源于stack exchange,提问作者Tong Zhang
相关产品推荐
相关产品推荐

