使用gtsummary生成事件表,如何添加行级事件汇总行?
用gtsummary实现行级事件总数统计的解决方案
问题背景
需要用gtsummary生成事件表,在表末添加一行统计所有行的事件总数,但add_overall()和add_n()仅支持列内跨组统计同一事件,无法实现行级汇总;尝试转为gt对象使用summary_rows()时因变量类型为factor报错。
示例数据
set.seed(123) # 设置种子确保结果可复现 x1 <- sample(c("No", "Yes"), 30, replace = TRUE, prob = c(0.85, 0.15)) x2 <- sample(c("No", "Yes"), 30, replace = TRUE, prob = c(0.9, 0.1)) x3 <- sample(c("No", "Yes"), 30, replace = TRUE, prob = c(0.75, 0.25)) y <- sample(c("A", "B"), 30, replace = TRUE, prob = c(0.5, 0.5)) df <- data.frame(as_factor(x1), as_factor(x2), as_factor(x3), as_factor(y)) colnames(df) <-c("event_1", "event_2", "event_3", "group") # 初始表格(无总事件行) tbl_summary(df, by=group, statistic = all_categorical() ~ "{n}")
解决方案
方法1:提前计算总事件数并加入表格
先在原数据中统计每个样本的总事件数,再汇总各组的总事件数,最后将该行添加到gtsummary表格中:
# 计算每个样本的"Yes"事件数,再按组求和 df$total_events <- rowSums(df[, c("event_1", "event_2", "event_3")] == "Yes") total_by_group <- aggregate(total_events ~ group, df, sum) # 创建表格并添加总事件行 tbl <- tbl_summary(df[, c("event_1", "event_2", "event_3", "group")], by = group, statistic = all_categorical() ~ "{n}") %>% modify_table_body( ~ .x %>% bind_rows( tibble( variable = "total_events", label = "总事件数", stat_0 = total_by_group$total_events[total_by_group$group == "A"], stat_1 = total_by_group$total_events[total_by_group$group == "B"], row_type = "label" ) ) ) tbl
方法2:直接从gtsummary结果提取数据计算汇总
无需修改原数据,直接从已生成的表格对象中提取各组事件计数,求和后添加新行:
# 创建初始表格 tbl <- tbl_summary(df, by=group, statistic = all_categorical() ~ "{n}") # 提取各事件的"Yes"计数 event_counts <- tbl$table_body %>% filter(variable %in% c("event_1", "event_2", "event_3")) %>% select(starts_with("stat_")) %>% mutate(across(everything(), ~ as.numeric(str_extract(.x, "\\d+")))) # 计算各组总事件数 total_counts <- colSums(event_counts, na.rm = TRUE) # 添加总事件行 tbl <- tbl %>% modify_table_body( ~ .x %>% bind_rows( tibble( variable = "total_events", label = "总事件数", stat_0 = total_counts[1], stat_1 = total_counts[2], row_type = "label" ) ) ) tbl
内容的提问来源于stack exchange,提问作者pavila
相关产品推荐
相关产品推荐

