SAS技术问询:如何递归删除距上一条保留记录30天内的实验室数据?
SAS 解决方案:筛选符合间隔要求的实验室记录
核心思路
- 先剔除所有标记为需移除的记录(即你提到的加粗记录)
- 按患者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
相关产品推荐
相关产品推荐

