R中如何批量生成原始题目与重编码二进制变量的双向列联表?
R批量生成题目的双向列联表方案
核心要解决的是循环中字符串变量名转成环境中实际变量的问题,使用rlang的sym()结合解引用操作符!!即可实现,这也是此前for循环无法正常运行的核心原因:tabyl不能直接识别字符串形式的变量名,需要做转换。以下是可直接运行的代码:
步骤1:加载依赖包
library(janitor) library(dplyr) # 用purrr批量处理更简洁,也可以用基础for循环实现 library(purrr)
步骤2:提取待匹配的题目变量名
# 匹配所有原始题目变量(格式为Item+数字,排除new_开头的重编码变量) item_names <- grep("^Item\\d+$", names(g3), value = TRUE)
步骤3:批量生成列联表
方案A:purrr批量处理(结果存为列表方便后续调用)
# 生成包含所有题目标联表的列表 crosstab_list <- map(item_names, function(item) { new_item <- paste0("new_", item) tab <- g3 %>% tabyl(!!sym(item), !!sym(new_item), show_na = TRUE) # 给列联表增加题目标记 attr(tab, "item_name") <- item return(tab) }) # 按格式打印所有列联表 walk(crosstab_list, function(tab) { cat("------------------------\n") cat(attr(tab, "item_name"), "\n") print(tab) cat("\n") })
方案B:基础for循环实现
如果你更习惯用基础for循环,可直接运行以下代码:
for (item in item_names) { new_item <- paste0("new_", item) cat("------------------------\n") cat(item, "\n") print(tabyl(g3, !!sym(item), !!sym(new_item), show_na = TRUE)) cat("\n") }
效果示例
运行后输出的Item1列联表如下,和预期格式完全匹配:
------------------------ Item1 Item1 0 1 NA a 2 0 0 b 3 0 0 c 0 10 0 d 1 0 0 <NA> 0 0 2
注意点
- 代码中的
g3为你的数据集名称,如果数据集命名有修改,对应替换即可 show_na = TRUE参数保证缺失值会被统计进列联表,符合需求
内容的提问来源于stack exchange,提问作者Shunsuke NISHIOKA
相关产品推荐
相关产品推荐

