如何用SAS将每个ID最后一行的Index值填充其前序缺失值?
用SAS填充ID组内缺失的Index值
问题说明
现有SAS数据集DB1:
data DB1; input ID Index; cards; 0001 . 0001 1 0003 . 0003 5 0004 . 0004 . 0004 2 ;
需要生成目标数据集DB2,将每个ID最后一行的非缺失Index值,填充到该ID所有行的Index位置(包括之前的缺失行):
data DB2; input ID Index; cards; 0001 1 0001 1 0003 5 0003 5 0004 2 0004 2 0004 2 ;
解决方案
方法1:提取目标值后合并(简洁直观)
先提取每个ID最后一行的Index值,再和原数据集合并填充:
/* 生成每个ID对应的目标Index值数据集 */ data id_target; set DB1; by ID; if last.ID; /* 仅保留每个ID的最后一行 */ keep ID Index; rename Index = target_Index; run; /* 合并原数据与目标值,完成填充 */ data DB2; merge DB1 id_target; by ID; Index = target_Index; drop target_Index; run;
方法2:利用RETAIN和倒序处理(无需额外合并)
通过倒序排列数据,用RETAIN保留目标值后再恢复顺序:
/* 记录原始行号,用于后续恢复顺序 */ data temp; set DB1; row_num = _n_; run; /* 按ID分组、原始行号倒序排列 */ proc sort data=temp; by ID descending row_num; run; /* 倒序遍历,用RETAIN保存每个ID的目标Index值 */ data temp_fill; set temp; by ID; retain fill_val; if first.ID then fill_val = Index; /* 每个ID的首行(原末行)赋值 */ Index = fill_val; drop fill_val row_num; run; /* 恢复原始顺序 */ proc sort data=temp_fill; by ID; run; data DB2; set temp_fill; run;
两种方法都能实现需求,方法1代码更短、易理解,适合常规场景;方法2避免了合并操作,在数据量较大时效率更优。
内容的提问来源于stack exchange,提问作者NewUsr_stat
相关产品推荐
相关产品推荐

