我的数据看起来像这样:
ID测试日期
001 A 9/1/2011
001 A 10/2/2011
001 A 9/12/2012
001 A 10/10/2013
001 B 10/1/2011
001 B 1/1/2012
002 A 10/12/2014
002 A 10/13/2014
002 A 2/2/2015
002 A 11/15/2015
我想要做的是在ID / Test的第一条记录中读取,然后将其与同一ID / Test的下一条记录进行比较。如果该测试日期不是至少365天,则删除它。然后重新测试下一条记录。如果至少365天后,我将保留它,并且在该ID /测试组中将其用作新的比较日期以用于下一个记录。但每个ID /测试组合将具有不同数量的记录和日期。
我希望它最终会像这样:
ID测试日期
001 A 9/1/2011
001 A 9/12/2012
001 A 10/10/2013
001 B 10/1/2011
002 A 10/12/2014
002 A 11/15/2015
感谢您的帮助 -
ETA:我尝试过的代码:
数据想要;设有; lagid =滞后(ID); lagtest =滞后(测试); lagdate =滞后(日期):
如果id = lagid AND test = lagtest则days = date-lagdate;
如果1天le 365然后删除;
运行;
此代码仅适用于彼此相邻的对。在我的示例数据中,它会给我不正确的结果 -
ID测试日期
001 A 9/1/2011
001 A 10/10/2013
001 B 10/1/2011
002 A 10/12/2014
ETA:我找到了一个使用RETAIN并通过ID和Test设置的解决方案。
答案 0 :(得分:0)
data begin;
input ID Test $ date mmddyy10.;
cards;
001 A 09/01/2011
001 A 10/02/2011
001 A 09/12/2012
001 A 10/10/2013
001 B 10/01/2011
001 B 01/01/2012
002 A 10/12/2014
002 A 10/13/2014
002 A 02/02/2015
002 A 11/15/2015
;
run;
proc sort data=begin; by id test date; run;
data processed;
retain days_since;
set begin;
by id test;
if first.test then do; /*Prime the flow variable and output the base values*/
days_since=date;
output;
end;
if (date-days_since)>=365 then do;
days_since = date;
output;
end;
format date yymmdd10.;
run;