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

如何为gtsummary的tbl_summary添加行与列总计?

解决方案:为gtsummary表格添加变量总计行

要在每个变量下方添加对应Overall、No、Yes的总计行,你可以通过自定义统计函数结合add_stat(),或者手动构建总计行并合并到表格两种方式实现,以下是具体代码和说明:

方法1:使用add_stat()自定义统计量

这种方法贴合gtsummary原生语法,直接在表格生成流程中插入总计行:

library(dplyr)
library(gtsummary)
library(purrr)

# 生成数据
set.seed(123)
member <- sample(c("Yes", "No"), 100, replace = TRUE)
author <- sample(c("Yes", "No"), 100, replace = TRUE)
review <- sample(0:10, 100, replace = TRUE)
publish <- sample(0:10, 100, replace = TRUE)
pay <- sample(0:10, 100, replace = TRUE)
data <- data.frame(member, author, review, publish, pay)

# 数据预处理:连续变量分组
data_processed <- data %>%
  mutate(across(c(review, publish, pay), 
                ~cut(., breaks = c(-Inf, 4.5, 5.5, Inf),
                     labels = c("No", "Maybe", "Yes"),
                     include.lowest = TRUE), 
                .names = "{.col}_group")) %>% 
  select(member, author, ends_with("group"))

# 自定义总计统计函数:计算各分组的总样本数
total_stat <- function(data, variable, by, ...) {
  overall_n <- nrow(data)
  group_ns <- data %>% count(.data[[by]]) %>% pull(n)
  
  list(
    overall = paste0(overall_n, " (100.0%)"),
    no_group = paste0(group_ns[1], " (100.0%)"),
    yes_group = paste0(group_ns[2], " (100.0%)")
  )
}

# 生成带总计行的表格
tbl_with_totals <- data_processed %>%
  tbl_summary(
    by = member,
    missing = "no", 
    statistic = list(all_categorical() ~ "{n} ({p}%)"),
    digits = list(all_categorical() ~ c(0, 1))
  ) %>%
  add_p(test = all_categorical() ~ "fisher.test") %>% 
  add_overall() %>% 
  # 添加总计行到每个变量下方
  add_stat(
    fns = all_categorical() ~ total_stat,
    location = "bottom"
  ) %>%
  bold_labels() %>%
  modify_header(stat_0 ~ "**Overall**", stat_1 ~ "**No**", stat_2 ~ "**Yes**")

# 查看表格
tbl_with_totals

方法2:手动构建总计行并合并

如果需要更灵活的控制,可以手动计算每个变量的总计行,再合并到表格主体中:

# 先生成基础表格
tbl_base <- data_processed %>%
  tbl_summary(
    by = member,
    missing = "no", 
    statistic = list(all_categorical() ~ "{n} ({p}%)"),
    digits = list(all_categorical() ~ c(0, 1))
  ) %>%
  add_p(test = all_categorical() ~ "fisher.test") %>% 
  add_overall() %>% 
  bold_labels()

# 计算所有变量的总计行
total_rows <- map_dfr(names(data_processed)[-1], function(var) {
  overall_n <- nrow(data_processed)
  group_counts <- data_processed %>% count(member) %>% pivot_wider(names_from = member, values_from = n)
  
  tibble(
    variable = var,
    row_type = "statistic",
    label = "Total",
    stat_0 = paste0(overall_n, " (100.0%)"),
    stat_1 = paste0(group_counts$No, " (100.0%)"),
    stat_2 = paste0(group_counts$Yes, " (100.0%)"),
    p.value = NA_real_
  )
})

# 合并总计行到表格并调整顺序
tbl_final <- tbl_base %>%
  modify_table_body(
    ~ bind_rows(., total_rows) %>%
      arrange(variable, row_type == "statistic")
  ) %>%
  modify_header(stat_0 ~ "**Overall**", stat_1 ~ "**No**", stat_2 ~ "**Yes**")

# 查看表格
tbl_final

两种方法都能实现需求:每个变量的分类行下方会新增一行Total,显示该变量对应的Overall总样本数、member=No组总样本数、member=Yes组总样本数(均以n (100.0%)格式呈现)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 02:17:39