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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 18:10:19