SAS:按ID重复最后一个值

问题描述 投票:0回答:2

我有这个数据库:

data temp;
input ID date type ;
  datalines;
 1 10/11/2006   1      
 1 10/12/2006   2      
 1 15/01/2007   2      
 1 20/01/2007   3    
 2 10/08/2008   1        
 2 11/09/2008   1        
 2 17/10/2008   1        
 2 12/11/2008   2    
 2 10/12/2008   3       
 ;

我想创建一个新列,在其中我用ID重复最后一个日期:

data temp;
input ID date type  last_date;
  datalines;
 1 10/11/2006   1        20/01/2007
 1 10/12/2006   2        20/01/2007
 1 15/01/2007   2        20/01/2007
 1 20/01/2007   3        20/01/2007
 2 10/08/2008   1        10/12/2008
 2 11/09/2008   1        10/12/2008
 2 17/10/2008   1        10/12/2008
 2 12/11/2008   2        10/12/2008
 2 10/12/2008   3        10/12/2008
 ;

我已经尝试过此代码,但是它不起作用:

  data temp;
  set temp;
  IF last.ID then last_date= .;
  RETAIN last_date;
  if   missing(last_date) then last_date= date;
  run;

谢谢您的帮助!

sas retain
2个回答
1
投票
首先是,除非在BY语句中包括变量ID,否则不会在数据步骤中创建FIRST.ID和LAST.ID变量。

第二是将最后一个日期附加到每个观测值,您需要将数据处理两次。您当前的代码(如果添加了BY语句)将仅在对by组的最后一次观察时为LAST_DATE分配一个值。

一种方法是按组中每个日期的降序对数据重新排序,然后可以使用BY ID,FIRST.ID和RETAIN。

proc sort data=have; by id descending date; run; data want; set have; by id descending date; if first.id then last_date=date; retain last_date; format last_date ddmmyy10.; run;

这是一种使用称为双重DOW循环的原始排序顺序的方法。通过将SET / BY语句放在DO循环中,您可以在数据步骤的一次通过中读取一组的所有观察值。然后,添加第二个DO循环以重新处理该BY组,并使用在第一个循环中计算出的信息并写出观察值。

data want; do until (last.id); set have; by id; end; last_date=date ; format last_date ddmmyy10.; do until (last.id); set have; by id; output; end; run;


1
投票
其他两种方法是:

    [Proc SQL加入子选择,或
  • Proc MEANS + DATA/MERGE
  • SQL

    proc sql; create table want as select have.*, id_group.max_date as last_date format=ddmmyy10. from have join ( select id, max(date) as max_date from have group by id ) as id_group on have.id = id_group.id ;

    手段

    proc means noprint data=have; by id; var date; output out=maxdates(keep=id last_date) max(date)=last_date; run; data want; merge have maxdates; by id; run;
  • © www.soinside.com 2019 - 2024. All rights reserved.