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

