SAS - 如何在读取数据文件时跳过记录

时间:2017-08-01 21:29:40

标签: sas

我的数据看起来像这样:

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设置的解决方案。

1 个答案:

答案 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;