如何在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
相关产品推荐
相关产品推荐

