SAS如何根据条件从一行到另一行继承或保留值进行比较

时间:2016-01-12 18:41:25

标签: sas retain

我有一些看起来像这样的数据:

ID   linker    dis_date    lag_disdate  days_supply disdiff  length
A    000 ddd   2/7/2014                   30           .     62
A    000 ddd   3/7/2014     2/7/2014      30           26    62 
A    000 ddd   4/16/2014    3/7/2014      30           38    62
A    000 ddd   5/19/2014    4/16/2014     30           31    62
A    000 ddd   7/17/2014    5/19/2014     30           57    62
A    000 ddd   9/11/2014    7/17/2014     30           54    62

逻辑是,如果disdiff小于length,则date1将是前一个disdate或lag_disdate,但date2将是当前dis_date减去一个。然而,这是从每一行到下一行的比较。所以理想的结果看起来像这样:

ID  date1      date2       disdate
A                          2/7/2014                        
A   2/7/2014   3/6/2014    3/7/2014
A   2/7/2014   4/15/2014   4/16/2014
A   2/7/2014   5/18/2014   5/19/2014
A   2/7/2014   7/16/2014   7/17/2014
A   2/7/2014   9/10/2014   9/11/2014

我尝试使用DoW循环来实现这一目标:

data test5;

do until (last.ID);

set test4;
by flag ID;
if first.ID=0 then do;
if disdiff <= length then date1=lag_disdate;
end;
output;
end;
run;

但我不确定如何编辑它以便每行保留2/7/2014。我确实尝试使用retain但是所有date1仍然等于每个lag_disdate,而不是2/7/2014。

更新:如果disdiff是&gt; length,date1将是记录的dis_date,而不是之前的date1。

1 个答案:

答案 0 :(得分:1)

你还没有说出disdiff > length时期望的结果。尽管如此,你几乎就在那里,试试这个:

data want ;
  set have ;
  by ID ;
  retain lag_disdate ;
  if first.ID then lag_disdate = dis_date ;
  else do ;
    if disdiff <= length then date1 = lag_disdate ;
    date2 = dis_date - 1 ;
  end ;

  format date1 date2 mmddyy10. ;
run ;