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

使用gtsummary()按分类暴露状态生成连续结局求和分层表

问题描述

需要创建一张按暴露状态分类分层的结局事件计数表,要求:

  • 单列显示结局事件数量及比例(事件数/N)
  • 行表示各暴露变量的二元是/否状态

现有数据字段:

  1. outcome_var:取值0-8的连续变量(代表事件计数,原数据存储为因子类型)
  2. exposure_1:二元分类变量(1=是,0=否)
  3. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 12:27:02