如何用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
相关产品推荐
相关产品推荐

