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

如何使用tbl_strata统计唯一个体数而非行数及相关tbl_summary问题

问题解决方案

1. 让tbl_strata输出唯一个体的统计结果

长表存在同一患者多行记录的情况,导致统计计数为行数而非患者数,可通过两种方式解决:

方法1:先去重再分析

先对长表按patientICN去重,保留每个患者的分层信息:

library(gtsummary)
library(dplyr)

# 长表去重:每个patientICN仅保留一行分层信息
df_Long_unique <- df_Long %>%
  distinct(patientICN, .keep_all = TRUE)

# 基于去重后的数据集运行分层统计
tbl_strata(
  data = df_Long_unique,
  strata = strata_var, # 替换为你的分层变量名
  .tbl_fun = ~.x %>%
    tbl_summary(
      include = c(var1, var2), # 替换为需要统计的变量
      statistic = list(all_continuous() ~ "{mean} ({sd})",
                       all_categorical() ~ "{n} ({p}%)")
    )
)

方法2:在tbl_summary中直接计算唯一患者数

无需修改原始数据集,自定义统计函数计算唯一患者的数量和占比:

# 定义统计唯一值的函数
n_unique <- function(x, ...) length(unique(x))
p_unique <- function(x, ...) n_unique(x)/length(unique(df_Long$patientICN))*100

tbl_strata(
  data = df_Long,
  strata = strata_var,
  .tbl_fun = ~.x %>%
    tbl_summary(
      include = c(var1, var2),
      statistic = list(all_categorical() ~ "{n_unique} ({p_unique}%)"),
      digits = list(p_unique ~ 1)
    ) %>%
    modify_header(all_stat_cols() ~ "**唯一个体数(占比)**")
)

2. 修改tbl_summary中by参数变量的显示顺序

通过将by变量转换为因子并指定水平顺序,即可控制输出顺序:

# 假设by变量为group_var,想要的顺序是"Group A" > "Group B" > "Group C"
df_Long_unique <- df_Long_unique %>%
  mutate(group_var = factor(group_var, levels = c("Group A", "Group B", "Group C")))

# 此时tbl_summary会按因子levels顺序展示分组
tbl_strata(
  data = df_Long_unique,
  strata = strata_var,
  .tbl_fun = ~.x %>%
    tbl_summary(
      include = c(var1, var2),
      by = group_var,
      statistic = list(all_continuous() ~ "{mean} ({sd})",
                       all_categorical() ~ "{n} ({p}%)")
    )
)

也可直接用modify_column_order()指定列顺序:

tbl_strata(
  data = df_Long_unique,
  strata = strata_var,
  .tbl_fun = ~.x %>%
    tbl_summary(
      include = c(var1, var2),
      by = group_var
    ) %>%
    modify_column_order(c("stat_Group A", "stat_Group B", "stat_Group C"))
)

3. 将宽表应用到现有代码中

宽表本身是每行对应一名患者,无需去重,直接传入tbl_strata即可:

# 假设宽表中的分层变量为strata_var_wide
tbl_strata(
  data = df_Wide,
  strata = strata_var_wide,
  .tbl_fun = ~.x %>%
    tbl_summary(
      include = c(demographics_var, clinical_var), # 替换为宽表中需统计的变量
      statistic = list(all_continuous() ~ "{mean} ({sd})",
                       all_categorical() ~ "{n} ({p}%)")
    ) %>%
    add_p() # 可选:添加组间比较p值
)

若宽表包含多列同类型变量(如多次随访数据),需先转长表再分析:

# 宽表转长表示例:将follow_up1、follow_up2转换为长表格式
df_Wide_to_Long <- df_Wide %>%
  pivot_longer(
    cols = starts_with("follow_up"),
    names_to = "follow_up_time",
    values_to = "follow_up_value"
  )

# 转长表后去重患者信息
df_Wide_to_Long_unique <- df_Wide_to_Long %>%
  distinct(patientICN, follow_up_time, .keep_all = TRUE)

# 运行分层统计
tbl_strata(
  data = df_Wide_to_Long_unique,
  strata = follow_up_time,
  .tbl_fun = ~.x %>%
    tbl_summary(
      include = c(follow_up_value, var1),
      statistic = list(all_continuous() ~ "{mean} ({sd})")
    )
)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 10:50:24