如何修正R语言table1包生成不良事件频率表时的百分比计算错误
用table1包按患者维度统计不良事件(AE)频率
我懂你的需求:默认table1调用是按AE发生次数计算频率,但你需要的是按患者数统计——也就是每个AE的占比为「发生该AE的患者数/总患者数」,同时表格里的N要显示总患者数而非AE事件数。
要实现这个目标,我们需要先预处理数据确保患者不被重复计数,再自定义统计逻辑适配需求,具体步骤如下:
步骤1:预处理数据,去除重复的患者-AE记录
首先要从原始数据中提取唯一的patient_id+group+link+AE组合,保证同一个患者在同一分组里的同一个AE只被统计一次:
library(dplyr) library(table1) # 原始数据 mydata=structure(list(patient_id = c("01-003", "01-003", "01-003", "01-003", "01-003", "01-003", "01-003", "01-004", "01-004", "01-004", "01-004", "01-004", "01-004"), group = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), AE = c("increase in lymphocytes", "increase in abs. lymphocytes", "increase in lymphocytes", "decrease in abs. neutrophils", "decrease in neutrophils", "decrease in abs. Monocytes", "decrease in monocytes", "increase in lymphocytes", "increase in abs. lymphocytes", "increase in lymphocytes", "decrease in abs. neutrophils", "decrease in neutrophils", "decrease in abs. Monocytes"), link = c("Connected", "Connected", "Connected", "Connected", "Connected", "Connected", "Not connected", "Connected", "Connected", "Not connected", "Connected", "Not connected", "Connected")), class = "data.frame", row.names = c(NA, -13L)) # 去重:保留每个患者-分组-link-AE的唯一记录 mydata_unique <- mydata %>% distinct(patient_id, group, link, AE, .keep_all = TRUE)
步骤2:自定义统计函数,实现患者维度的频率计算
默认统计逻辑是按行(事件数)计算,我们需要自定义函数,让它计算「发生该AE的患者数/该分组总患者数」,并显示正确的N:
# 自定义分类变量统计函数 patient_based_stats <- function(x) { # 获取当前分组的总患者数 current_strata <- attr(x, "strata") total_patients <- length(unique(mydata_unique$patient_id[ mydata_unique$group == current_strata$group & mydata_unique$link == current_strata$link ])) # 获取发生当前AE的患者数 n_patients <- length(unique(x)) # 计算百分比并格式化输出 pct <- round(n_patients / total_patients * 100, 1) sprintf("%d (%.1f%%)", n_patients, pct) } # 将自定义函数设为table1默认的分类变量统计函数 table1:::setDefaultSummaryFunction(categorical = patient_based_stats)
步骤3:生成符合要求的频率表
用去重后的数据调用table1,即可得到按患者维度统计的结果:
table1(~ AE | link + group, data = mydata_unique)
效果说明
生成的表格会满足你的需求:
- 每个分组的N显示为该分组的总患者数(比如你的示例中每个
link+group组合的N都是2) - 每个AE的频率为「发生该AE的患者数/总患者数」,比如
increase in lymphocytes会显示为2 (100.0%)
如果之后需要恢复默认统计逻辑,可运行:
table1:::setDefaultSummaryFunction(categorical = NULL)
内容的提问来源于stack exchange,提问作者psysky
相关产品推荐
相关产品推荐

