在SAS中如何查找ID序列中缺失的编号?
查找SAS数据集中连续ID序列的缺失编号
这里提供两种实用的SAS代码方案,帮你找出连续ID序列里的缺失编号:
方法一:数据步逐行对比
如果数据集还没按ID排序,先做排序确保序列有序,再通过保留上一个ID的值,对比当前ID与前一个ID的差值,找出中间的缺失项:
/* 按ID排序(若数据集未排序) */ proc sort data=have; by id; run; /* 提取缺失ID */ data missing_ids; set have; retain prev_id; if _n_ = 1 then do; /* 检查序列起始是否有缺失(比如ID从3开始,补1、2) */ if id > 1 then do; do missing_id = 1 to id - 1; output; end; end; end; else do; /* 对比当前ID与上一个ID,差>1则中间的都是缺失项 */ if id > prev_id + 1 then do; do missing_id = prev_id + 1 to id - 1; output; end; end; end; prev_id = id; run; /* 查看结果 */ proc print data=missing_ids noobs; var missing_id; run;
方法二:PROC SQL生成完整序列后匹配
先获取ID的最小和最大值,生成这个范围内的完整ID序列,再通过左连接找出原数据集中不存在的ID:
/* 获取ID的范围 */ proc sql noprint; select min(id), max(id) into :min_id, :max_id from have; quit; /* 生成完整序列并匹配缺失项 */ proc sql; select t1.id as missing_id from (select &min_id. + monotonic() - 1 as id from sashelp.class(obs=&max_id. - &min_id. + 1)) t1 left join have t2 on t1.id = t2.id where t2.id is null order by missing_id; quit;
补充说明
- 如果你的ID序列起始不是1,方法一中的
1替换成实际起始值即可;方法二会自动用ID的最小值作为起始,无需手动调整。 - 若需要检查序列终点之后的缺失(比如预期到15但实际到10),可以手动调整
&max_id.为预期最大值。
内容的提问来源于stack exchange,提问作者InPhamouZ
相关产品推荐
相关产品推荐

