如何用tbl_summary()生成以原始样本量(N=5)统计的汇总表
问题解决:用gtsummary生成基于原始样本量的汇总表
你遇到的核心问题是separate_rows()拆分后,样本量被错误统计为9(拆分后的行数),但实际需要基于原始5个患者计算百分比。以下是用gtsummary实现需求的具体方案:
方法一:转换为宽格式统计(推荐,贴合gtsummary使用逻辑)
先将数据处理为「患者-类别唯一记录」,再转成宽格式让gtsummary基于原始患者数统计:
library(dplyr) library(tidyr) library(gtsummary) # 原始数据 df <- structure(list(id = c("patient1", "patient2", "patient3", "patient4", "patient5"), x = c("h,a,a", "i", "i", "i,a,e", "h")), class = "data.frame", row.names = c(NA, -5L)) # 生成目标汇总表 df %>% # 拆分每个患者的x值并展开 mutate(x = strsplit(x, ",")) %>% unnest(x) %>% # 去重:同一患者的同一类别只保留1条记录 distinct(id, x) %>% # 转宽格式:每个类别作为列,值为1(该患者有此类别)/0(无) pivot_wider(names_from = x, values_from = x, values_fn = ~1, values_fill = 0) %>% select(-id) %>% # 生成汇总表 tbl_summary( type = everything() ~ "categorical", statistic = everything() ~ "{n} ({p}%)", missing = "no" ) %>% modify_header(label ~ "X类别") %>% # 手动指定总样本量为原始的5 modify_table_body(~ .x %>% mutate(N = 5))
方法二:先统计再用gtsummary呈现
先计算每个类别的患者数和百分比,再用gtsummary格式化输出:
# 预统计每个类别的患者数与百分比 summary_df <- df %>% mutate(x = strsplit(x, ",")) %>% unnest(x) %>% distinct(id, x) %>% count(x, name = "患者数") %>% mutate(百分比 = paste0(round(患者数 / nrow(df) * 100, 1), "%")) %>% rename(类别 = x) # 用gtsummary生成表格 summary_df %>% tbl_summary( type = everything() ~ "continuous", statistic = everything() ~ "{value}" ) %>% modify_header(label ~ "指标")
两种方法都能实现基于原始5个患者的百分比统计,最终表格样式符合gtsummary的默认规范,可通过modify_*系列函数进一步调整格式。
内容的提问来源于stack exchange,提问作者TarJae
相关产品推荐
相关产品推荐

