基于条件计数(R语言):调整跨年份诊断的统计规则
问题描述
我有如下格式的data.table数据集:
dt <- data.table(diagnosis = c("A","B", "C", "C"), only_2020= c(1, 0, 0, 1), only_2010= c(0, 0, 0, 0), Both_years= c(0, 1, 1, 0), ID = c(1, 2, 2, 3), YEAR = c(2020, 2020, 2010, 2020))
注:原代码中诊断值未加引号,这里修正为字符串格式以避免运行报错。
该数据集记录了患者在仅2020年、仅2010年或两年均有诊断的情况。需要实现通用规则:
- 当同一ID两年诊断不同时,2020年的诊断需计入
only_2020字段 - 若同一ID两年诊断相同,则不计入
only_2020
最终期望得到如下统计结果:
diagnosis only_2020 both_years A 1 0 B 1 1 C 1 1
解决方案
针对大规模数据集,利用data.table的高效分组特性实现需求,完整代码如下:
library(data.table) # 修正后的原始数据集 dt <- data.table(diagnosis = c("A","B", "C", "C"), only_2020= c(1, 0, 0, 1), only_2010= c(0, 0, 0, 0), Both_years= c(0, 1, 1, 0), ID = c(1, 2, 2, 3), YEAR = c(2020, 2020, 2010, 2020)) # 标记每个ID是否存在两年诊断不同的情况 dt[, has_diff_diagnosis := uniqueN(diagnosis) > 1 & .N == 2, by = ID] # 调整only_2020字段:保留原仅2020的记录,加上跨年度诊断不同的2020记录 dt[, adjusted_only_2020 := ifelse(YEAR == 2020 & (only_2020 == 1 | has_diff_diagnosis), 1, 0)] # 按诊断分组统计最终结果 result <- dt[, .( only_2020 = sum(adjusted_only_2020), both_years = sum(Both_years) ), by = diagnosis] print(result)
运行后输出与期望一致:
diagnosis only_2020 both_years 1: A 1 0 2: B 1 1 3: C 1 1
关键逻辑说明
uniqueN(diagnosis) > 1 & .N == 2:筛选出有且仅有两年记录、且两年诊断不同的IDadjusted_only_2020:整合两类需要计入only_2020的情况——原本仅2020年有诊断的记录,以及跨年度诊断不同的2020年记录- 最后按
diagnosis分组求和,得到统计结果,该方法效率高,适合处理大规模数据集
内容的提问来源于stack exchange,提问作者Hellihansen
相关产品推荐
相关产品推荐

