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

如何在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

代码说明

  1. 先生成基础统计表格,保留连续变量的原有展示格式;
  2. 通过bind_rows为每个分类变量添加一行“非缺失观测数”统计行,计算各分组的非缺失观测总数;
  3. 使用arrange调整行顺序,确保“非缺失观测数”行位于分类变量的首个统计行位置,和连续变量的展示逻辑统一;
  4. 可根据需求修改行标签(比如改成N)。

此方法既实现了和连续变量一致的展示效果,又不会让表格显得杂乱,同时适配宽表格场景。

内容的提问来源于stack exchange,提问作者Marrrrie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 23:25:00