You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 12:15:36