如何使用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
相关产品推荐
相关产品推荐

