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

在gtsummary包中为分组变量添加百分比

在gtsummary分组表头添加样本量与百分比

问题背景

基于pubh包的Bernard数据集,以fate(死亡状态)为分组变量创建gtsummary汇总表时,需要在分组表头的Alive、Dead旁添加对应样本量及占比(如Alive, N = 96 (67%))。尝试将fate列为分类变量并指定百分比统计量的方法无效,希望直接在tbl_summary()流程内完成配置,无需提前用mutate生成新变量。

原示例代码:

library(pubh)
library(dplyr)
library(gtsummary)

data("Bernard")

na.omit(Bernard) %>% select(fate, race, apache) %>%
  tbl_summary(by = fate,
              type = list(race ~ "categorical", apache ~ "continuous"),
              statistic = list(all_continuous() ~ "{min}, {max}", all_categorical() ~ "{p}%"),
              digits = list(all_continuous() ~ 2, all_categorical() ~ 2),
              missing_text = "(Missing)" ) %>% 
  add_stat_label() %>%
  modify_header(label ~ "**Variable**") %>%
  modify_caption("**Table 1. Summary statistics by  Mortality Status**") %>%
  modify_spanning_header(c("stat_1", "stat_2") ~ "**Fate**") %>%
  bold_labels() %>%
  italicize_labels() %>%
  italicize_levels() 

解决方案

利用gtsummary的modify_header()函数,结合内置的.data对象动态获取分组样本量、总样本量及分组标签,直接拼接出带样本量和百分比的表头。

修改后的完整代码:

library(pubh)
library(dplyr)
library(gtsummary)

data("Bernard")

na.omit(Bernard) %>% select(fate, race, apache) %>%
  tbl_summary(by = fate,
              type = list(race ~ "categorical", apache ~ "continuous"),
              statistic = list(all_continuous() ~ "{min}, {max}", all_categorical() ~ "{p}%"),
              digits = list(all_continuous() ~ 2, all_categorical() ~ 2),
              missing_text = "(Missing)" ) %>% 
  add_stat_label() %>%
  # 关键:修改分组表头,添加样本量与百分比
  modify_header(
    label ~ "**Variable**",
    stat_1 ~ paste0("**{.data$by_labels[1]}**", ", N = {.data$N[1]} ({round(.data$N[1]/.data$N_tbl*100, 1)}%)"),
    stat_2 ~ paste0("**{.data$by_labels[2]}**", ", N = {.data$N[2]} ({round(.data$N[2]/.data$N_tbl*100, 1)}%)")
  ) %>%
  modify_caption("**Table 1. Summary statistics by  Mortality Status**") %>%
  modify_spanning_header(c("stat_1", "stat_2") ~ "**Fate**") %>%
  bold_labels() %>%
  italicize_labels() %>%
  italicize_levels() 

代码说明

  • .data$by_labels:获取分组变量的标签(即Alive、Dead)
  • .data$N:获取每个分组的样本量
  • .data$N_tbl:获取总样本量
  • 通过round()函数控制百分比的小数位数,这里保留1位,可根据需求调整

执行后,表头会显示:
**Alive**, N = 96 (67.1%) | **Dead**, N = 47 (32.9%)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 08:01:03