使用purr::map创建嵌套列联表矩阵的技术问询
解决方案
要生成仅包含对应变量因子水平的嵌套列联表,核心思路是直接对变量两两组合提取原数据的对应列生成列联表,避免将所有变量混为一列导致因子水平合并。以下是tidy风格的实现代码:
步骤1:构造示例数据(可替换为你的mydata)
library(tidyverse) mydata <- tibble( var1 = factor(c("a", "b", "c", "c", "b")), var2 = factor(c("Yes", "No", "Yes", "Yes", "No")), var3 = factor(c(1, 1, 1, 2, 2)) )
步骤2:生成变量两两组合并创建嵌套列联表
# 获取所有变量名 vars <- names(mydata) # 生成所有变量的两两配对(含自身配对) var_pairs <- expand.grid(row_var = vars, col_var = vars, stringsAsFactors = FALSE) # 生成嵌套列联表(保留table对象,可直接传入chisq.test) cross_table_result <- var_pairs %>% mutate( contingency_table = map2(row_var, col_var, ~ table(mydata[[.x]], mydata[[.y]])) ) %>% pivot_wider( names_from = col_var, values_from = contingency_table )
步骤3:验证与使用
查看var1和var2的列联表(仅包含两者的因子水平):
cross_table_result$var1$var2 # 输出: # Yes No # a 1 0 # b 0 2 # c 2 0
直接传入卡方检验:
chisq.test(cross_table_result$var1$var2)
如果需要将列联表转为tibble格式用于探索性分析,只需修改map2内的逻辑:
cross_table_tibble <- var_pairs %>% mutate( contingency_tibble = map2(row_var, col_var, ~ mydata %>% select(all_of(c(.x, .y))) %>% table() %>% as_tibble()) ) %>% pivot_wider( names_from = col_var, values_from = contingency_tibble )
原方法问题说明
你之前的代码将所有变量转为长格式后,measure列的因子水平是所有变量水平的合并集,因此生成的table会包含所有无关水平。直接提取原数据的对应列生成table,能保留每个变量自身的因子水平,避免冗余。
内容的提问来源于stack exchange,提问作者DF78
相关产品推荐
相关产品推荐

