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

如何在gt_summary的变量标签中添加观测总数?

在gt_summary中为变量标签添加总观测数

问题描述

使用gt_summary的tbl_summary()生成统计表格时,已通过missing = "always"为每个变量添加缺失值单独行,希望在变量标签中直接追加该变量的总观测数(格式如变量名 (n = X))。尝试过在tbl_summary()的label参数中使用"{n}"占位符,以及用add_stat_label(label = "n = {n}"),但占位符未被解析,且不想增加额外列数,询问是否有内置实现方式。

示例代码

library(tidyverse)
library(gtsummary)
library(gt)

# 生成带缺失值的示例数据
database = data.frame(
  INDIV_AGE = rnorm(100, mean = 50, sd = 4),
  INDIV_GENDER = rbinom(100, size=1, prob = 0.6),
  INDIV_ETHNICS = sample(c("North America", "Western Europe", "Africa", "Eastern Europe", "Asia", "Other"), size = 100, replace = T, prob = c(0.3, 0.2, 0.4, 0.02, 0.01, 0.07)),
  INDIV_ECOGRP = sample(c(1,2,3,4), size = 100, replace = T, prob = c(0.6, 0.1, 0.2, 0.1)),
  ENV_POLLEVEL = rpois(100, lambda = 4), 
  ENV_FLOODPROFILE = sample(c("Low", "Intermediate", "High", "Extreme"), size = 100, replace = T, prob = c(0.1, 0.65, 0.2, 0.05))
)
# 为每个变量随机插入10%缺失值
database[] <- lapply(database, function(x) { x[sample(seq_along(x), 0.1 * length(x))] <- NA; x })

# 原代码(占位符未解析)
a = database |> 
  tbl_summary(
    include = everything(),
    missing = "always",
    missing_text = "Missing data",
    missing_stat = "{N_miss} ({p_miss}%)",
    type = INDIV_AGE ~ "continuous",
    statistic = list(
      all_continuous() ~ "{median} [{p25}-{p75}]",
      all_categorical() ~ "{n} ({p}%)"
      ),
    by = INDIV_GENDER
  ) |> 
  modify_header(
    label = "",
    stat_2 = "**Yes**\nN={n}",
    stat_1 = "**No**\nN={n}") |> 
  modify_spanning_header(all_stat_cols()~"**Gender**") |> 
  add_p() |> 
  bold_p() |> 
  # 原尝试的方法,占位符未解析
  add_stat_label(
    label = everything() ~ "n = {n}"
  )

print(a)  

解决方案

可以使用modify_table_body()直接修改表格的标签列,利用tbl_summary对象中已有的N列(存储每个变量的总观测数)来拼接标签。这是gt_summary的内置操作方式,无需额外扩展包,也不会增加列数。

修改后的完整代码

library(tidyverse)
library(gtsummary)
library(gt)

# 生成数据部分同前
database = data.frame(
  INDIV_AGE = rnorm(100, mean = 50, sd = 4),
  INDIV_GENDER = rbinom(100, size=1, prob = 0.6),
  INDIV_ETHNICS = sample(c("North America", "Western Europe", "Africa", "Eastern Europe", "Asia", "Other"), size = 100, replace = T, prob = c(0.3, 0.2, 0.4, 0.02, 0.01, 0.07)),
  INDIV_ECOGRP = sample(c(1,2,3,4), size = 100, replace = T, prob = c(0.6, 0.1, 0.2, 0.1)),
  ENV_POLLEVEL = rpois(100, lambda = 4), 
  ENV_FLOODPROFILE = sample(c("Low", "Intermediate", "High", "Extreme"), size = 100, replace = T, prob = c(0.1, 0.65, 0.2, 0.05))
)
database[] <- lapply(database, function(x) { x[sample(seq_along(x), 0.1 * length(x))] <- NA; x })

# 修改后的表格代码
a = database |> 
  tbl_summary(
    include = everything(),
    missing = "always",
    missing_text = "Missing data",
    missing_stat = "{N_miss} ({p_miss}%)",
    type = INDIV_AGE ~ "continuous",
    statistic = list(
      all_continuous() ~ "{median} [{p25}-{p75}]",
      all_categorical() ~ "{n} ({p}%)"
      ),
    by = INDIV_GENDER
  ) |> 
  modify_header(
    label = "",
    stat_2 = "**Yes**\nN={n}",
    stat_1 = "**No**\nN={n}") |> 
  modify_spanning_header(all_stat_cols()~"**Gender**") |> 
  add_p() |> 
  bold_p() |> 
  # 核心:修改标签列,追加总观测数
  modify_table_body(
    ~ .x |> 
      mutate(
        label = ifelse(
          row_type == "label",  # 仅针对变量标签行
          paste0(label, " (n = ", N, ")"),  # 拼接标签和总观测数
          label  # 缺失值行保持原标签
        )
      )
  )

print(a)  

代码说明

  • modify_table_body()是gt_summary的核心内置函数,用于直接操作表格的底层数据框。
  • 表格的row_type列标记了每行的类型:"label"对应变量名称行,"missing"对应缺失值行。我们只需要修改row_type == "label"的行。
  • N列存储了每个变量的总观测数(包含缺失值的总样本量),直接提取该值拼接至标签后即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 20:19:59