You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 20:49:53