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

解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 22:46:34