我有一些看起来像这样的数据:
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。
答案 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 ;