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

如何在gtsummary的modify_header中保留big.mark数字格式?

解决gtsummary表头{n}未应用千位分隔符的问题

当使用theme_gtsummary_language设置big.mark后,modify_header中的{n}会直接调用原始数值,不会自动应用主题里的千位分隔符格式。以下是几种可行的解决方式:

方法1:利用gtsummary内置格式化函数(原生方案)

使用gtsummary的fmt_number函数对{n}进行格式化,该函数会自动读取主题中设置的big.mark参数,无需重复指定:

library(gtsummary)
library(ggplot2)
library(glue)

theme_gtsummary_language("en", big.mark = " ")

ggplot2::diamonds %>%
  select(cut) %>%
  tbl_summary() %>%
  modify_header(
    all_stat_cols() ~ "**{level}**, \n N = {fmt_number(n)}"
  )

如果需要手动指定格式(比如临时覆盖主题设置),也可以在fmt_number里显式传入参数:

modify_header(
  all_stat_cols() ~ "**{level}**, \n N = {fmt_number(n, big.mark = ' ')}"
)

方法2:提前提取并格式化数值后传入表头

先生成表格对象,提取各统计列的n值并格式化,再通过动态绑定传入表头:

library(gtsummary)
library(ggplot2)
library(glue)
library(purrr)

theme_gtsummary_language("en", big.mark = " ")

tbl <- ggplot2::diamonds %>%
  select(cut) %>%
  tbl_summary()

# 提取并格式化所有n值
formatted_ns <- map_chr(tbl$table_body$n, ~format(.x, big.mark = " "))

tbl %>%
  modify_header(
    all_stat_cols() ~ glue("**{level}**, \n N = {formatted_ns[match(level, tbl$table_body$label)]}")
  )

方法3:转换为flextable后调整表头

如果需要使用flextable,可以直接修改表头单元格内容,手动格式化数值:

library(gtsummary)
library(ggplot2)
library(flextable)
library(glue)
library(stringr)

theme_gtsummary_language("en", big.mark = " ")

tbl <- ggplot2::diamonds %>%
  select(cut) %>%
  tbl_summary() %>%
  as_flextable()

# 获取gtsummary表格的元数据
tbl_meta <- attr(tbl, "gtsummary")$table_body

# 遍历所有统计列,替换表头内容
for (col_idx in which(grepl("stat_", colnames(tbl)))) {
  col_name <- colnames(tbl)[col_idx]
  var_name <- str_remove(col_name, "stat_")
  row_data <- tbl_meta[tbl_meta$variable == var_name, ]
  
  new_header <- glue("**{row_data$label}**, \n N = {format(row_data$n, big.mark = ' ')}")
  tbl <- tbl %>% set_header_labels(!!col_name := new_header)
}

tbl

这种方式更灵活,适合需要对flextable进行更多定制化调整的场景。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 11:17:54