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

SAS技术问询:如何递归删除距上一条保留记录30天内的实验室数据?

SAS 解决方案:筛选符合间隔要求的实验室记录

核心思路

  1. 先剔除所有标记为需移除的记录(即你提到的加粗记录)
  2. 按患者ID分组,用retain变量跟踪上一条被保留的检验日期,以此判断当前记录是否满足「与上一条保留记录间隔超30天」的条件——避免用lag(),因为它会取原始数据集的上一条记录(哪怕被剔除了),导致判断错误。

代码实现

假设原始数据集为raw_lab,其中is_excluded变量标记需移除的记录(is_excluded=1对应加粗记录);若Lab_Date是字符型,先转为SAS日期型再计算间隔。

/* 第一步:过滤需移除的记录,转换日期格式(若需要) */
data filtered_lab;
    set raw_lab;
    /* 字符型日期转SAS日期型,适配"Jan 1 2023"格式 */
    if not missing(Lab_Date) then do;
        lab_date_sas = input(Lab_Date, date9.);
        format lab_date_sas date9.;
    end;
    /* 只保留未标记移除的记录 */
    where is_excluded ne 1;
run;

/* 第二步:按ID筛选满足间隔要求的记录 */
data final_lab;
    set filtered_lab;
    by ID;
    retain last_kept_date; /* 跟踪上一条保留的日期 */
    
    if first.ID then do;
        /* 每个患者的第一条记录直接保留 */
        output;
        last_kept_date = lab_date_sas;
    end;
    else do;
        /* 计算与上一条保留记录的间隔,超过30天则保留并更新跟踪日期 */
        if (lab_date_sas - last_kept_date) > 30 then do;
            output;
            last_kept_date = lab_date_sas;
        end;
    end;
run;

关键细节

  • retain变量的作用:它会在数据步迭代时保留上一次的值,配合by ID语句,每个患者组开始时自动重置,确保只跟踪当前患者已保留的最新日期。
  • 日期计算:SAS日期型变量相减直接得到天数差,必须确保Lab_Date已转换为SAS日期型,否则无法正确计算间隔。
  • 针对你的示例:以患者1111为例,过滤后剩下1月1日和2月3日的记录,两者间隔33天,满足条件,所以都会保留——完全符合你描述的需求。

内容的提问来源于stack exchange,提问作者M. Yates

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 14:22:27