如何统计患者分组观测多变量唯一值并生成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
相关产品推荐
相关产品推荐

