SAS填充缺少的值

SAS填充缺少的值,sas,retain,Sas,Retain,我有以下数据: data test ; INPUT id st end ; datalines ; 1 17 . 1 17 . 1 17 17.5 1 17 . 1 17 . 2 15 . 2 15 . 2 15 . 2 15 . 2 15 15.75 run ; data test2 ; set test ; dur = end - st ; run ; 我想通过id填写缺少的dur值,给出: id st end dur 1 17 . 17.5 1 17

我有以下数据:

data test ;
INPUT id st end ;
datalines ;
1 17 .
1 17 .
1 17 17.5
1 17 .
1 17 .
2 15 .
2 15 .
2 15 .
2 15 .
2 15 15.75
run ;

data test2 ;
set test ;
dur = end - st ;
run ;
我想通过id填写缺少的dur值,给出:

id   st   end   dur
1    17    .    17.5
1    17    .    17.5
1    17   17.5  17.5
1    17    .    17.5
2    15    .    15.75
2    15    .    15.75
2    15    .    15.75
2    15    .    15.75
2    15   15.75 15.75
由于行的顺序不同,无法使用proc sort和retain,如何替换缺少的dur值?不使用合并,因为实际数据集非常大。

您可以使用proc sort和retain(如您所说)来获得正确的dur列,但它不会提供与示例输出相同的结构:

proc sort data = test;
  by id descending end;
run;

data test2 ;
  set test ;
  by id;
  retain dur;
  if first.id then dur = end - st ;
run;
然后test2看起来像:

id  st  end     dur
1   17  17.5    0.5 
1   17  .       0.5 
1   17  .       0.5 
1   17  .       0.5 
1   17  .       0.5 
2   15  15.75   0.75    
2   15  .       0.75    
2   15  .       0.75    
2   15  .       0.75    
2   15  .       0.75    
但是,如果数据太大,proc排序可能会非常慢。proc SQL方法可能更有用:

proc sql;
  create table test2 as
  select id, st, end, max(end-st) as dur
  from test
  group by id;
quit;