如何修改CreateTableOne函数解决重复观测计数错误及非正态变量展示问题
问题解决方案
一、修正重复观测导致的性别计数错误
问题根源:当前数据集为长结构,同一受试者存在多条重复测量记录,直接调用CreateTableOne会将每条记录判定为独立个体,导致性别、年龄这类受试者层面的固定变量计数错误。
解决逻辑:先将数据集转换为每个唯一ID对应一行的受试者水平结构,对重复测量的任务类变量(如acc、resp等)先按ID聚合统计后,再生成汇总表。
操作逻辑:
- 使用
dplyr包的group_by+distinct逻辑,按ID分组聚合任务变量,再保留每个ID的唯一行。 - 若仅需统计人口学变量的计数,直接对ID、性别、年龄三个变量去重即可。
二、非正态变量替换为中位数(Q1,Q3)展示
直接在CreateTableOne函数中添加nonnormal参数,传入不符合正态分布的变量名向量,tableone包会自动将对应变量的统计量从默认的均值(标准差)替换为中位数(第一四分位数, 第三四分位数)。
修正后完整代码示例
library(dplyr) library(tableone) library(knitr) # 构建每个ID对应一行的分析数据集 d_analyze <- d %>% group_by(ID) %>% # 对重复测量的任务变量按ID聚合,可按需替换为均值、最大值等统计量 mutate(acc_subj = median(acc, na.rm = TRUE)) %>% ungroup() %>% # 每个ID仅保留唯一行,避免重复计数 distinct(ID, .keep_all = TRUE) # 生成汇总表 result_tab <- CreateTableOne( vars = c('Task general', 'Grd', 'key', 'resp', 'age', 'acc_subj'), # 此处按实际分组需求调整strata参数,如需按性别分组则保持当前设置 strata = 'gender', factorVars = c('gender'), # 指定非正态变量,自动输出中位数(Q1,Q3) nonnormal = c('age', 'acc_subj'), argsApprox = list(correct = FALSE), smd = TRUE, addOverall = TRUE, test = TRUE) # 输出表格 result_tab %>% na.omit() %>% kableone()
注:若确实需要保留长格式数据做重复测量层面的汇总,仅需修正性别计数,可通过
svydesign构建调查权重,将每个ID的权重设置为1/该ID的重复测量次数即可,上述方案为适用场景最广的稳妥解法。
内容的提问来源于stack exchange,提问作者12666727b9
相关产品推荐
相关产品推荐

