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

如何统计患者分组观测多变量唯一值并生成tbl_summary汇总表

解决方案

你原有代码的问题是用unique()作为汇总函数时,若同一患者存在多个不同取值,summarise会生成多条患者记录,导致统计逻辑错误。你可以通过患者级汇总+列表列存储多值分类变量的方案实现需求,完美适配逻辑型、字符型、因子型各类变量,且能直接匹配你要的表格结构。

第一步:加载依赖包

library(tidyverse)
library(gtsummary)

第二步:生成患者级汇总数据

按患者ID分组汇总,逻辑变量用any()判断是否至少有一次为真,分类变量用列表存储该患者所有出现过的非空取值:

patient_level <- evals %>%
  group_by(id_patient) %>%
  summarise(
    # 处理逻辑型变量
    treat_1 = any(treat_1, na.rm = TRUE),
    treat_2 = any(treat_2, na.rm = TRUE),
    # 处理字符/因子型变量,返回列表列
    treat_1_type = list(unique(na.omit(treat_1_type))),
    treat_2_type = list(unique(na.omit(treat_2_type)))
  ) %>%
  ungroup()

如果你的分类变量是因子型,生成的表格会自动保留预设的因子水平顺序,不需要额外调整。

第三步:用tbl_summary生成目标汇总表

gtsummary天然支持列表列分类变量的统计,默认会计算至少包含对应水平的患者数及占比,完全符合你的需求:

patient_level %>%
  select(treat_1, treat_2, treat_1_type, treat_2_type) %>%
  tbl_summary(
    # 配置变量类型
    type = list(
      all_logical() ~ "dichotomous",
      treat_1_type ~ "categorical",
      treat_2_type ~ "categorical"
    ),
    # 逻辑变量仅统计TRUE的情况
    value = list(all_logical() ~ TRUE),
    # 配置展示的统计格式
    statistic = list(
      all_dichotomous() ~ "{n} ({p}%)",
      all_categorical() ~ "{n} ({p}%)"
    ),
    # 配置变量显示标签,加黑符合你要的样式
    label = list(
      treat_1 = "**treat_1**",
      treat_2 = "**treat_2**",
      treat_1_type = "**treat_1_type**",
      treat_2_type = "**treat_2_type**"
    )
  ) %>%
  # 修改表头为你指定的样式
  modify_header(
    label = "变量",
    stat_0 = "全部患者(n={N})"
  )

小提示:如果需要调整百分比的小数位数,可以在tbl_summary中新增digits参数,例如digits = list(all_variables() ~ c(0, 1))代表整数保留0位,百分比保留1位小数。

运行后生成的表格会自动对分类变量的水平做缩进展示,完全匹配你给出的期望结构。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 13:09:03