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

