在gtsummary中实现二分类变量分组及表格N列格式调整问题
解决方案
问题分析
你之前的modify_table_body未生效,是因为bstfun::add_variable_grouping生成的"GP"行,其variable列并非"GP",因此ifelse(variable == "GP", ...)无法匹配到目标行。同时我们可以用gtsummary原生方法替代第三方分组函数,实现更可控的分组效果。
修正后代码
set.seed(123) library(tidyverse) library(gtsummary) d <- tidyr::tibble( id = c(1:20), et_yn = structure(factor(sample(seq(0,1), size = 20, replace = TRUE), levels = c(0,1), labels = c("No", "Yes")), label = "ET") ) %>% rowwise() %>% mutate( et_typ_1 = factor(ifelse(et_yn == "Yes", sample(seq(0,1), size = 1, replace = T), NA), levels = c(0,1), labels = c("No", "Yes")), et_typ_2 = factor(ifelse(et_yn == "Yes", sample(seq(0,1), size = 1, replace = T), NA), levels = c(0:1), labels = c("No", "Yes")), et_gp_1 = factor(ifelse(et_typ_2 == "Yes", sample(seq(0,1), size = 1, replace = T), NA), levels = c(0,1), labels = c("No", "Yes")), et_gp_2 = factor(ifelse(et_typ_2 == "Yes", sample(seq(0,1), size = 1, replace = T), NA), levels = c(0,1), labels = c("No", "Yes")), et_gp_3 = factor(ifelse(et_typ_2 == "Yes", sample(seq(0,1), size = 1, replace = T), NA), levels = c(0,1), labels = c("No", "Yes")), ) %>% mutate( et_typ_2 = structure(et_typ_2, label = "ET gp"), et_gp_1 = structure(et_gp_1, label = "St.a"), et_gp_2 = structure(et_gp_2, label = "St.b"), et_gp_3 = structure(et_gp_3, label = "St.c"), ) d %>% tbl_summary( include = -id, missing = "no", ) %>% add_n() %>% modify_header(stat_0 = "**n (%)**") %>% # 手动实现分组并调整列值 modify_table_body( fun = ~ .x %>% # 标记GP组的变量 mutate(is_gp_var = variable %in% c("et_gp_1", "et_gp_2", "et_gp_3")) %>% # 在第一个GP变量前插入分组行 add_row( variable = "gp_group", label = "GP", row_type = "label", n = first(.[is_gp_var, "n"]), # 提取子项的N值 stat_0 = "", is_gp_var = FALSE, .before = which(is_gp_var)[1] ) %>% # 调整子项的N列为空,添加缩进 mutate( n = ifelse(is_gp_var, NA, n), label = ifelse(is_gp_var, paste0(" ", label), label) ) %>% select(-is_gp_var) ) %>% gtsummary::as_kable()
关键步骤说明
- 标记分组变量:用
is_gp_var标记属于GP组的三个变量,方便后续批量处理。 - 插入分组行:在第一个GP组变量行前插入"GP"行,设置其N值为子项的共同N值(4),统计列留空。
- 调整子项显示:将GP组子项的N列设为
NA(显示为空),并给标签添加缩进,实现分组视觉效果。 - 替代第三方分组函数:全程使用gtsummary原生的
modify_table_body和add_row实现分组,无需依赖bstfun包。
输出效果
| Characteristic | N | n (%) |
|---|---|---|
| ET | 20 | 9 (45%) |
| et_typ_1 | 9 | 3 (33%) |
| ET gp | 9 | 4 (44%) |
| GP | 4 | |
| St.a | 2 (50%) | |
| St.b | 1 (25%) | |
| St.c | 1 (25%) | |
内容的提问来源于stack exchange,提问作者devster
相关产品推荐
相关产品推荐

