SAS 按ID分组删除单条日期记录逻辑未按预期运行
错误原因
- BY组粒度与需求不匹配
你当前代码中proc sort和data步的BY ID date语句将分组粒度设定为「ID+日期」的组合,first.date and last.date同时为真仅代表当前观测是它所在的「ID+日期」分组中的唯一一条,完全不符合你预期的「删除同一ID下仅存在单个对应日期的所有条目」的逻辑。 - 输出为空的直接原因
你的数据集内所有「ID+日期」分组大概率都只有1条观测,导致所有观测都命中了delete条件,最终输出数据集无剩余记录。
正确实现方案
方案1:SQL实现(逻辑清晰易读)
/* 统计每个ID对应的唯一日期数量 */ proc sql noprint; create table id_date_count as select ID, count(distinct date) as date_cnt from have group by ID; quit; /* 过滤保留日期数大于1的ID的所有记录 */ proc sql noprint; create table want as select a.* from have a inner join id_date_count b on a.ID = b.ID where b.date_cnt > 1; quit;
方案2:Data步双SET实现
proc sort data=have; by ID date; run; data want; /* 第一次遍历统计每个ID的唯一日期数 */ set have; by ID; retain date_cnt; if first.ID then date_cnt = 0; if first.date then date_cnt + 1; /* 匹配到ID的最后一条记录时,判断是否需要输出该ID的全部记录 */ if last.ID then do; if date_cnt > 1 then do until(last.ID); set have; by ID; output; end; end; run;
补充排查
如果你实际需求就是删除「ID+日期」分组下仅有1条的观测,原有逻辑是成立的,可先运行以下代码排查分组的记录数分布:
proc freq data=have; tables ID*date / out=group_record_count noprint; run; proc print data=group_record_count; where count = 1; run;
内容的提问来源于stack exchange,提问作者user6610400
相关产品推荐
相关产品推荐

