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

如何在R中结合gtsummary与tidyverse实现带卡方检验的交叉表

用gtsummary实现分组交叉表并添加卡方检验脚注

步骤1:数据预处理(分组转换)

先把review、publish、pay三个数值变量按要求转换成分类变量:

  • No:0-4
  • Maybe:5
  • Yes:6-10
library(tidyverse)
library(gtsummary)

# 生成用户提供的测试数据
set.seed(123)
member <- sample(c("Yes", "No"), 100, replace = TRUE)
author <- sample(c("Yes", "No"), 100, replace = TRUE)
review <- sample(0:10, 100, replace = TRUE)
publish <- sample(0:10, 100, replace = TRUE)
pay <- sample(0:10, 100, replace = TRUE)
data <- data.frame(member, author, review, publish, pay)

# 批量处理三个变量的分组转换
data <- data %>%
  mutate(
    across(c(review, publish, pay), 
           ~case_when(
             .x %in% 0:4 ~ "No",
             .x == 5 ~ "Maybe",
             .x %in% 6:10 ~ "Yes"
           ),
           .names = "{.col}_grp")
  )

步骤2:生成Member为行变量的交叉表

用gtsummary::tbl_cross生成带行/列总计、百分比的交叉表,并自动添加卡方检验结果作为脚注:

# Member与三个指标分组的交叉表
tbl_member <- data %>%
  select(member, review_grp, publish_grp, pay_grp) %>%
  # 把多列指标转成长格式,一次性生成合并交叉表
  pivot_longer(cols = -member, names_to = "指标", values_to = "分组") %>%
  tbl_cross(
    row = member,
    col = c(指标, 分组),
    percent = "row", # 显示行百分比,需列百分比可改为"column"
    missing = "no"
  ) %>%
  add_total(rows = TRUE, cols = TRUE) %>% # 添加行、列总计
  add_p(test = "chisq.test") %>% # 添加卡方检验P值
  modify_header(
    stat_0 ~ "**分组**",
    stat_1 ~ "**No**",
    stat_2 ~ "**Maybe**",
    stat_3 ~ "**Yes**",
    stat_total ~ "**总计**"
  ) %>%
  modify_footnote(
    all_stat_cols() ~ "括号内为行百分比",
    p.value ~ "卡方检验P值"
  ) %>%
  modify_caption("表1:Member与各指标分组的交叉表")

# 输出表格
tbl_member

步骤3:生成Author为行变量的交叉表

替换行变量为author即可快速生成另一组交叉表:

# Author与三个指标分组的交叉表
tbl_author <- data %>%
  select(author, review_grp, publish_grp, pay_grp) %>%
  pivot_longer(cols = -author, names_to = "指标", values_to = "分组") %>%
  tbl_cross(
    row = author,
    col = c(指标, 分组),
    percent = "row",
    missing = "no"
  ) %>%
  add_total(rows = TRUE, cols = TRUE) %>%
  add_p(test = "chisq.test") %>%
  modify_header(
    stat_0 ~ "**分组**",
    stat_1 ~ "**No**",
    stat_2 ~ "**Maybe**",
    stat_3 ~ "**Yes**",
    stat_total ~ "**总计**"
  ) %>%
  modify_footnote(
    all_stat_cols() ~ "括号内为行百分比",
    p.value ~ "卡方检验P值"
  ) %>%
  modify_caption("表2:Author与各指标分组的交叉表")

# 输出表格
tbl_author

关键代码说明

  • across()批量处理三个数值变量的分组转换,保证格式统一
  • pivot_longer()将多列指标合并为长格式,实现一次性生成多指标交叉表
  • tbl_cross()的percent参数可灵活切换行/列百分比
  • add_total()补充行、列总计,直观展示整体分布
  • add_p()自动计算卡方检验并将结果嵌入表格
  • modify_header()和modify_footnote()优化表格可读性,完全匹配需求格式

内容的提问来源于stack exchange,提问作者Cherson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 00:28:37