如何用gtsummary生成按SOC/PT分组的患者年风险与发病率表
用gtsummary实现SOC/PT嵌套分组的安全性统计表格
你的gt实现示例代码及效果
gt代码
library(gt) library(dplyr) # 模拟安全性事件数据 safety_data <- tibble( SOC = c(rep("消化系统", 3), rep("神经系统", 2)), PT = c("恶心", "呕吐", "腹泻", "头痛", "头晕"), n_events = c(12, 8, 5, 6, 3), patient_years = c(240, 240, 240, 240, 240), rate_100py = n_events / patient_years * 100 ) # 构建嵌套分组表格 gt_safety_table <- safety_data %>% group_by(SOC) %>% gt(groupname_col = "SOC") %>% tab_header(title = "安全性事件统计(按SOC/PT分组)") %>% fmt_number(columns = rate_100py, decimals = 2) %>% cols_label( PT = "首选术语(PT)", n_events = "事件数", patient_years = "患者年", rate_100py = "每100患者年发病率" ) %>% tab_style( style = cell_text(weight = "bold"), locations = cells_group(groups = TRUE) ) gt_safety_table
gt实现效果

gtsummary实现方案
gtsummary可以通过add_row_group()结合tbl_summary()快速实现嵌套分组,同时自带临床统计常用的格式化逻辑,以下是对应代码:
library(gtsummary) library(dplyr) # 使用与gt示例相同的模拟数据 safety_data <- tibble( SOC = c(rep("消化系统", 3), rep("神经系统", 2)), PT = c("恶心", "呕吐", "腹泻", "头痛", "头晕"), n_events = c(12, 8, 5, 6, 3), patient_years = c(240, 240, 240, 240, 240), rate_100py = n_events / patient_years * 100 ) # 构建嵌套分组的统计表格 gtsummary_safety_table <- safety_data %>% tbl_summary( include = c(PT, n_events, patient_years, rate_100py), label = list( PT ~ "首选术语(PT)", n_events ~ "事件数", patient_years ~ "患者年", rate_100py ~ "每100患者年发病率" ), # 针对不同列设置统计格式 statistic = list( n_events ~ "{.}", patient_years ~ "{.}", rate_100py ~ "{fmt_number(., decimals = 2)}" ) ) %>% # 添加SOC作为行分组,实现嵌套效果 add_row_group( variable = SOC, label = ~.y ) %>% # 高亮分组行 modify_table_styling( locations = cells_row_groups(), style = list(cell_text(weight = "bold")) ) %>% # 添加表格标题 modify_caption("安全性事件统计(按SOC/PT分组)") gtsummary_safety_table
进阶:多层级嵌套扩展
如果需要在SOC下再添加次级分组(如严重程度),可以用tbl_strata()实现:
# 扩展数据:增加严重程度列 safety_data_extended <- safety_data %>% mutate(severity = c("轻度", "中度", "轻度", "中度", "轻度")) # 构建双层嵌套表格 gtsummary_nested_table <- tbl_strata( data = safety_data_extended, strata = SOC, # 第一层分组:SOC .tbl_fun = function(data) { data %>% tbl_summary( by = severity, # 第二层分组:严重程度 include = c(PT, n_events, rate_100py), label = list(PT ~ "首选术语(PT)", n_events ~ "事件数", rate_100py ~ "每100患者年发病率"), statistic = list(rate_100py ~ "{fmt_number(., decimals = 2)}") ) } ) %>% modify_table_styling( locations = cells_row_groups(), style = list(cell_text(weight = "bold")) ) gtsummary_nested_table
内容的提问来源于stack exchange,提问作者xiecheng gu
相关产品推荐
相关产品推荐

