如何编写SAS程序检测同一ID下奔驰与保时捷的hour值是否重复
SAS解决方案:同一ID下Mercedes与Porsche小时值重复检测
方法一:数据步结合RETAIN语句实现跨观测判断
先按id排序(确保同一ID的观测连续),再用RETAIN语句暂存当前ID下Mercedes和Porsche的hour值,最后对同一ID的所有观测标记错误状态:
/* 先按ID排序,保证同一ID的观测连续 */ proc sort data=old; by id; run; /* 生成带error标记的新数据集 */ data new; set old; by id; /* 定义并保留两个品牌的hour值,ID切换时重置 */ retain mercedes_hour porsche_hour; if first.id then do; mercedes_hour = .; porsche_hour = .; end; /* 分别存储两个品牌的hour值 */ if brand = 'Mercedes' then mercedes_hour = hour; else if brand = 'Porsche' then porsche_hour = hour; /* 判断是否满足错误条件:两个hour值都非空且相等 */ if not(missing(mercedes_hour)) and not(missing(porsche_hour)) and mercedes_hour = porsche_hour then error = 1; else error = 0; drop mercedes_hour porsche_hour; run;
方法二:PROC SQL关联查询实现标记
通过提取每个ID下两个品牌的hour值,再与原表关联判断是否重复:
proc sql; create table new as select o.*, case when m.hour = p.hour then 1 else 0 end as error from old o left join (select id, hour from old where brand='Mercedes') m on o.id = m.id left join (select id, hour from old where brand='Porsche') p on o.id = p.id; quit;
结果说明
运行上述代码后,id=13、id=14、id=16的所有观测会被标记error=1,因为这三个ID下Mercedes和Porsche的hour值完全相同;其余ID的error值为0。
内容的提问来源于stack exchange,提问作者Froggy pete
相关产品推荐
相关产品推荐

