SAS中如何基于ID首次观测标记存在字段变更的ID
SAS实现ID变更标记方案
你已经完成数据集按ID升序、变更字段降序排序的预处理,直接用以下两种方案即可实现需求,不需要复杂的循环逻辑。
方案1:DATA步双循环实现(性能最优,适合大数据量)
data want; /* 第一轮循环:按ID分组判断是否存在变更 */ do until(last.ID); set have; /* 此处have替换为你的源数据集名 */ by ID; /* 「变更字段」替换为你数据集中记录变更情况的实际字段名 */ if 变更字段 ne . then change_flag = 0; end; /* 第二轮循环:将标记同步到该ID的所有行后输出 */ do until(last.ID); set have; by ID; output; end; run;
逻辑说明
- 第一轮循环仅判断ID分组是否存在变更,因为你已按变更字段降序排序,有变更的记录排在分组最前,首次循环即可得到结果,性能损耗极低
- 无变更的ID全程不会触发
change_flag的赋值,最终值默认是缺失值.,完全符合你的规则要求 - 如果你之前的DO UNTIL逻辑运行失败,基本是两个原因:仅做了单轮循环导致标记只赋值到ID组的单行记录,或是没有保留标记变量值导致被PDV自动清空
方案2:PROC SQL实现(代码最简,适合中小数据量)
proc sql; create table want as select *, case when max(变更字段) is not null then 0 else . end as change_flag from have group by ID /* 保留你需要的排序规则,不需要排序可以删掉下一行 */ order by ID, 变更字段 desc; quit;
逻辑说明
SQL会自动将分组聚合的计算结果同步到该ID组的所有行,不需要手动处理行同步逻辑,代码可读性更高。
内容的提问来源于stack exchange,提问作者Pinka
相关产品推荐
相关产品推荐

