解决gtsummary中tbl_strata()全缺失变量的0(NA%)显示及相关需求
解决gtsummary分层展示的三个问题:移除无效行、调整选项位置、控制p值与脚注
问题场景
用gtsummary::tbl_strata()按Auto/Beauty店铺类型分层展示数据时,碰到三个棘手问题:
- 只有Beauty店才有的变量,在Auto分层里全是缺失值,但输出里硬显示
0(NA%),想把这行彻底删掉 - 部分变量的
Unknown选项要挪到选项列表的最底部 - Auto分层里这个Beauty专属变量不用算p值,也不能出现对应的脚注
完整解决代码
先搭个可复现的数据集,再放代码:
library(gtsummary) library(tidyverse) # 造个测试数据 set.seed(123) data <- tibble( shop_type = sample(c("Auto", "Beauty"), 200, replace = TRUE), common_var = sample(c("Yes", "No", "Unknown"), 200, replace = TRUE), # 只有Beauty店有这个变量,Auto店全是NA beauty_only_var = case_when( shop_type == "Beauty" ~ sample(c("High", "Medium", "Low", "Unknown"), 100, replace = TRUE), TRUE ~ NA_character_ ) ) # 第一步:把Unknown设为变量的最后一个选项,确保显示在底部 data <- data %>% mutate( common_var = factor(common_var, levels = c("Yes", "No", "Unknown")), beauty_only_var = factor(beauty_only_var, levels = c("High", "Medium", "Low", "Unknown")) ) # 第二步:写个自定义的分层统计函数,处理不同分层的变量和p值 strata_summary_fun <- function(data) { # 先拿到当前是Auto还是Beauty分层 current_shop <- unique(data$shop_type) # 构建基础统计表 tbl <- data %>% select(common_var, beauty_only_var) %>% tbl_summary( missing = "no", # 不单独显示缺失值行 statistic = all_categorical() ~ "{n} ({p}%)", # Auto分层只统计公共变量,Beauty分层统计所有变量 include = if (current_shop == "Auto") c("common_var") else c("common_var", "beauty_only_var") ) %>% add_p( # 公共变量用卡方检验,Auto分层不计算专属变量的p值 test = list(common_var = "chisq.test"), include = if (current_shop == "Auto") c("common_var") else c("common_var", "beauty_only_var") ) # 如果是Auto分层,直接删掉beauty_only_var的所有行 if (current_shop == "Auto") { tbl <- tbl %>% modify_table_body( filter, !variable %in% "beauty_only_var" ) } tbl } # 第三步:生成最终的分层表格 final_tbl <- data %>% tbl_strata( strata = shop_type, strata_fun = strata_summary_fun, combine_with = "tbl_merge", tab_spanner = c("**Auto Shop**", "**Beauty Shop**") ) %>% # 统一设置脚注(如果有单独的脚注需求,在这里改就行) modify_footnote( all_stat_cols() ~ "n (%)", all_p_cols() ~ "Pearson's Chi-squared test" ) final_tbl
关键操作说明
1. 把Unknown挪到最底部
直接用factor()指定变量的水平顺序,把Unknown放在最后,gtsummary就会按这个顺序显示选项,不用额外调整:
common_var = factor(common_var, levels = c("Yes", "No", "Unknown"))
2. 删掉Auto分层的无效行
在自定义的分层函数里,判断当前是Auto分层时,用modify_table_body()过滤掉专属变量的行,彻底移除那行0(NA%),不会再显示。
3. 控制p值和脚注
- 在
tbl_summary()和add_p()的include参数里,Auto分层只保留公共变量,这样专属变量根本不会被纳入统计,自然不会有p值 - 最后用
modify_footnote()统一设置脚注,只有存在p值的变量才会显示对应的脚注,Auto分层里没有专属变量的p值,也就不会出现多余脚注
最终效果
- Auto分层只显示公共变量,完全看不到Beauty专属变量的痕迹
- 所有变量的
Unknown选项都乖乖待在最底部 - Auto分层没有专属变量的p值和脚注,Beauty分层正常显示该变量的统计结果和p值
内容的提问来源于stack exchange,提问作者Shannon
相关产品推荐
相关产品推荐

