【问题标题】:SAS - How to skip a record when reading in a data fileSAS - 读取数据文件时如何跳过记录
【发布时间】:2017-08-01 21:29:40
【问题描述】:

我的数据看起来像这样:

身份证测试日期

001 A 2011 年 9 月 1 日
001 A 2011 年 10 月 2 日
001 A 2012 年 9 月 12 日
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/Test 组合都有不同数量的记录和日期。

我希望它最终是这样的:

身份证测试日期

001 A 2011 年 9 月 1 日
001 A 2012 年 9 月 12 日
001 A 10/10/2013
001 B 10/1/2011
002 A 10/12/2014
002 A 2015 年 11 月 15 日

感谢您的帮助 -

ETA:我尝试​​过的代码:

数据需要;设置有; 滞后=滞后(ID);滞后=滞后(测试); lagdate=lag(日期):

如果 id=lagid AND test=lagtest 那么 days=date-lagdate;

如果 1 le 天 le 365 则删除;

运行;

此代码仅适用于彼此相邻的对。在我的示例数据中,它会给我错误的结果 -

身份证测试日期

001 A 2011 年 9 月 1 日
001 A 2013 年 10 月 10 日
001 B 2011 年 10 月 1 日
002 A 2014 年 10 月 12 日


ETA:我找到了使用 RETAIN 并通过 ID 和测试设置的解决方案。

【问题讨论】:

  • 你试过什么?你能显示一些代码吗?
  • 我想通了 - 最终使用 RETAIN 语句来比较日期,然后当我到达我想要保留的记录时更新保留的变量。

标签: sas


【解决方案1】:
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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-29
    • 2014-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-20
    • 2018-08-20
    相关资源
    最近更新 更多