如何在tbl_summary中为分类变量添加独立的非缺失观测总行?
在gtsummary统计表格中为分类变量添加单独一行展示非缺失观测总数
问题背景
需求:在tbl_summary生成的统计表格中,为分类变量添加单独一行,展示用于计算百分比的非缺失观测总数,实现与连续变量一致的展示效果。
遇到的问题:
- 使用
{n} / {N} ({p}%)格式会让表格内容杂乱; - 尝试在
all_categorical()的statistic参数中添加"{N}"时,触发错误:! The statistic requested for variable 'grade' cannot have length greater than 1.; - 了解过新增列的实现方案,但当前处理的部分表格较宽,该方案不适用。
附初始代码:
library(tidyverse) library(gtsummary) trial2 <- trial %>% select(trt, age, grade) trial2 %>% tbl_summary( by = trt, type = all_continuous() ~ "continuous2", statistic = list( all_continuous2() ~ c("{N_nonmiss}", "{mean} ({sd})", "{median} ({p25}, {p75})"), all_categorical() ~ c(#{"N"}, "{n} / {N} ({p}%)") ), digits = list(all_continuous() ~ c(0, 1, 1)), label = grade ~ "Tumor Grade", missing = "no", )
解决方案
由于gtsummary对分类变量默认限制单个统计量行,我们可以通过modify_table_body手动为分类变量插入非缺失观测数的行,具体实现如下:
library(tidyverse) library(gtsummary) trial2 <- trial %>% select(trt, age, grade) # 生成基础表格 tbl <- trial2 %>% tbl_summary( by = trt, type = all_continuous() ~ "continuous2", statistic = list( all_continuous2() ~ c("{N_nonmiss}", "{mean} ({sd})", "{median} ({p25}, {p75})"), all_categorical() ~ "{n} / {N} ({p}%)" ), digits = list(all_continuous() ~ c(0, 1, 1)), label = grade ~ "Tumor Grade", missing = "no", ) # 为分类变量添加N行 tbl_with_n <- tbl %>% modify_table_body( ~ .x %>% # 提取分类变量信息,生成N行数据 bind_rows( filter(., row_type == "label") %>% filter(variable %in% all_categorical(trial2)) %>% mutate( row_type = "statistic", label = "非缺失观测数", # 可自定义行标签 # 计算每个分组的非缺失观测数 across(all_of(tbl$by_vars), ~ sum(!is.na(trial2[[cur_column()]]))) ) ) %>% # 调整行顺序:让N行位于分类变量的第一个统计行位置 arrange(variable, match(row_type, c("label", "statistic")), match(label, "非缺失观测数")) ) # 查看最终表格 tbl_with_n
代码说明
- 先生成基础统计表格,保留连续变量的原有展示格式;
- 通过
bind_rows为每个分类变量添加一行“非缺失观测数”统计行,计算各分组的非缺失观测总数; - 使用
arrange调整行顺序,确保“非缺失观测数”行位于分类变量的首个统计行位置,和连续变量的展示逻辑统一; - 可根据需求修改行标签(比如改成
N)。
此方法既实现了和连续变量一致的展示效果,又不会让表格显得杂乱,同时适配宽表格场景。
内容的提问来源于stack exchange,提问作者Marrrrie
相关产品推荐
相关产品推荐

