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

如何用dplyr和gtsummary为多列变量生成交叉表?报错求助

问题解决:tbl_cross报错与多变量交叉表实现

报错原因

tbl_cross()的col参数仅支持传入单个分类变量,你代码中用select(ends_with("group"))一次性传入多个变量,违反了函数参数设计要求,导致报错。

解决方案

要生成你需要的「多变量+行总计」交叉表,推荐用gtsummary包的tbl_summary()函数(更贴合需求),或者将数据重塑为长格式后分组处理,以下是两种可行方案:

方案一:用tbl_summary()快速生成目标表

先处理数据生成分组变量,再生成带总计和统计检验的交叉表:

library(dplyr)
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 %>%
  mutate(across(c(review, publish, pay), 
                ~cut(., breaks = c(-Inf, 4.5, 5.5, Inf),
                     labels = c("No", "Maybe", "Yes"),
                     include.lowest = TRUE), 
                .names = "{.col}_group")) %>% 
  select(member, ends_with("group")) %>%
  tbl_summary(
    by = member,  # 行维度为member分组
    type = all_categorical() ~ "categorical",
    statistic = all_categorical() ~ "{n} ({p}%)",  # 显示频数+百分比
    digits = all_categorical() ~ c(0, 1),  # 频数取整,百分比保留1位
    missing = "no"  # 不展示缺失值
  ) %>%
  add_overall(col_label = "Total") %>%  # 添加行总计列
  add_p(test = all_categorical() ~ "fisher.test") %>%  # 添加Fisher检验p值
  modify_spanning_header(all_stat_cols() ~ "**会员状态**")  # 美化表头分组

方案二:重塑数据后用tbl_cross分组实现

如果坚持使用tbl_cross(),需先将多列变量转为长格式,再分层生成交叉表:

library(dplyr)
library(tidyr)
library(gtsummary)

# 数据处理同方案一,先生成分组变量
data_processed <- data %>%
  mutate(across(c(review, publish, pay), 
                ~cut(., breaks = c(-Inf, 4.5, 5.5, Inf),
                     labels = c("No", "Maybe", "Yes"),
                     include.lowest = TRUE), 
                .names = "{.col}_group")) %>% 
  select(member, ends_with("group"))

# 转为长格式后分层生成交叉表
data_processed %>%
  pivot_longer(cols = ends_with("group"), 
               names_to = "指标", 
               values_to = "分组") %>%
  tbl_strata(
    strata = 指标,
    .tbl_fun = ~.x %>%
      tbl_cross(
        row = member,
        col = 分组,
        margin = "row",
        missing = "no",
        statistic = list(all_categorical() ~ "{n} ({p}%)"),
        digits = list(all_categorical() ~ c(0, 1))
      ) %>%
      add_p(test = all_categorical() ~ "fisher.test")
  )

内容的提问来源于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 03:08:18