You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于条件计数(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:筛选出有且仅有两年记录、且两年诊断不同的ID
  • adjusted_only_2020:整合两类需要计入only_2020的情况——原本仅2020年有诊断的记录,以及跨年度诊断不同的2020年记录
  • 最后按diagnosis分组求和,得到统计结果,该方法效率高,适合处理大规模数据集

内容的提问来源于stack exchange,提问作者Hellihansen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 05:22:49