如何在gtsummary中修改统计N值?及适配gtsummary的one-hot数据整形方法
长表格式下tbl_summary的N值修正与适配方案
无需删除id列实现基于唯一受访人数的N统计
你遇到的样本量虚增,本质是长表格式下同一受访人对应多行记录,tbl_summary()默认按行数统计N时没有做ID去重。完全没必要在调用函数前删除id列,只要两个简单调整就能实现需求:
- 用
include参数明确指定需要纳入统计的列,id列会被自动排除,既不会参与数值统计,也不会出现在最终表格中 - 传入
group = id参数:该参数是gtsummary为重复测量、聚类数据场景设计的,传入后函数会自动将总N的计算逻辑切换为非重复ID计数,直接得到真实的受访人总数。如果后续需要自定义单个分组的N值(比如适配部分样本仅在某一组有数据的场景),也可以通过modify_footnote()手动替换脚注里的N数值,灵活度很高。
适配gtsummary的长表整形规范
结合你“两组样本重叠不完全、部分样本仅单组有测量数据”的实际情况,长表整形不需要做过度裁剪,遵循两个规则就能完美兼容gtsummary的统计逻辑:
pivot_longer()转换时不要添加values_drop_na = TRUE参数。过早删除缺失值行,会直接丢失“哪些受访者仅在单组有测量数据”的信息;保留所有原始行的情况下,tbl_summary()会自动识别每个分组下的非缺失观测,计算对应的有效受访人数,不需要手动筛选调整。- 全程保留id列,出表时通过参数声明id的作用即可,既不会让id被纳入统计,又能让函数基于id做跨重复行的N值去重,从根源上避免样本量虚增。
可直接运行的参考代码
你提供的示例代码存在管道符不闭合的语法问题,下面是覆盖你实际场景(两组样本重叠不完全)的可运行示例:
# 加载依赖包 library(dplyr) library(gtsummary) library(tidyr) library(tibble) # 模拟原始宽表数据 df_wide <- data.frame( id = 1:100, drug1_dose = rnorm(100), drug2_dose = rnorm(100) ) %>% # 模拟实际场景:部分样本仅存在单组测量数据 mutate( drug1_dose = ifelse(id %in% 1:70, drug1_dose, NA), drug2_dose = ifelse(id %in% 31:100, drug2_dose, NA) ) # 转换为长表,不提前删除缺失值 df_long <- df_wide %>% pivot_longer( cols = c(drug1_dose, drug2_dose), names_to = "drug", values_to = "dose" ) # 直接生成统计表格,无需删除id列 df_long %>% tbl_summary( by = drug, # 按药物分组开展组间对比 include = dose, # 仅统计dose变量,自动排除id列 group = id # 声明id为受访人唯一标识,自动按唯一ID计算N值 )
输出效果说明
上述代码生成的表格会完全匹配你的统计需求:
- 表格脚注展示的总N为所有受访人的唯一计数,不会因为长表的多记录格式导致样本量翻倍虚增
- 每个药物分组下的有效样本N,会自动统计该组下有有效剂量数据的受访人数,无需手动计算调整。
内容的提问来源于stack exchange,提问作者jurqchicken
相关产品推荐
相关产品推荐

