使用gtsummary()按分类暴露状态生成连续结局求和分层表
问题描述
需要创建一张按暴露状态分类分层的结局事件计数表,要求:
- 单列显示结局事件数量及比例(事件数/N)
- 行表示各暴露变量的二元是/否状态
现有数据字段:
outcome_var:取值0-8的连续变量(代表事件计数,原数据存储为因子类型)exposure_1:二元分类变量(1=是,0=否)exposure_2:同类型的另一二元分类变量
编写的初始代码仅在outcome_var行显示结局求和值,其余行均为暴露状态的计数,不符合需求;尝试by = outcome_var后生成多列结局取值,调整后仍无法得到目标效果,询问是否需要用tbl_custom_summary实现需求。
数据结构如下:
structure(list(outcome_var = structure(c(0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1), levels = c("No", "Yes")), exposure_1 = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, NA, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L), levels = c("1", "0"), class = "factor"), exposure_2 = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, NA, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), levels = c("0", "1"), class = "factor")), class = "data.frame", row.names = c(NA, -239L))
期望表格样式:每行对应暴露变量的一个水平(如暴露1 是/否),列显示该水平下结局事件的总数,以及总数占该暴露水平总样本量的比例(格式如事件数 (比例%))。
解决方案
使用tbl_custom_summary可以完全自定义统计量计算逻辑,完美实现需求,代码如下:
library(gtsummary) library(dplyr) # 数据预处理:将outcome_var转为数值型(原数据为因子,无法直接求和) df <- df %>% mutate(outcome_var = as.numeric(as.character(outcome_var))) # 创建自定义汇总表格 tbl_custom <- df %>% tbl_custom_summary( # 指定要汇总的暴露变量 include = c(exposure_1, exposure_2), # 设置变量显示标签 label = list(exposure_1 ~ "暴露1", exposure_2 ~ "暴露2"), # 自定义统计量计算逻辑 stat_fns = list( all_categorical() ~ function(x, y) { # x为暴露变量分组,y为结局变量 sum_outcome <- tapply(y, x, sum, na.rm = TRUE) group_n <- tapply(y, x, function(z) sum(!is.na(z))) prop_outcome <- sum_outcome / group_n * 100 # 拼接成目标格式 paste0(sum_outcome, " (", sprintf("%.1f", prop_outcome), "%)") } ), # 设置统计量列的标签 stat_labels = list(all_categorical() ~ "结局事件总数 (占比%)"), # 不显示缺失值行 missing = "no" ) %>% # 调整表格头部样式 modify_header(all_stat_cols() ~ "**结局事件总数 (占比%)**") %>% # 添加脚注说明统计量含义 modify_footnote(all_stat_cols() ~ "结局事件总数 / 该暴露水平有效样本量 (占比%)") # 输出表格 tbl_custom
代码说明
- 数据转换:原
outcome_var存储为因子类型,必须转为数值型才能进行求和运算。 - 自定义统计量:针对每个暴露变量的分组,分别计算结局事件总和、有效样本量,再计算占比并拼接成要求的格式。
- 样式调整:通过
modify_header和modify_footnote优化表格的可读性,使输出更符合科研表格规范。
内容的提问来源于stack exchange,提问作者Rolvix Patterson
相关产品推荐
相关产品推荐

