【问题标题】:Loop over time periods循环时间段
【发布时间】:2022-08-17 21:11:32
【问题描述】:

假设有以下数据集:

ID          Date_Start    Date_End      Flag1       Flag2    
001         13JAN2015     01JUN2018       1           0
001         02JUN2018     02JUL2018       1           0
001         03JUL2018     31DEC2020       1           0           
002         01JAN2015     31DEC2020       1           0                     
003         01JAN2017     31DEC2019       1           0                    
003         01JAN2020     31DEC2021       1           0                     
004         01JAN2011     31DEC2021       1           2               
.....        .........     .........     .....      ......       

期望的输出:

ID          Date_Start    Date_End      Flag1       Flag2    
001         13JAN2015     01JUN2018       1           0
001         02JUN2018     02JUL2018       1           0
001         03JUL2018     31DEC2020       1           10           
002         01JAN2015     31DEC2020       1           10                     
003         01JAN2017     31DEC2019       1           0                    
003         01JAN2020     31DEC2021       1           10                     
004         01JAN2011     31DEC2021       1           2                    

……………………………………………………………………………………………………………………………………

换句话说:如果 Flag2 == 0 和 Flag1 == 1 将 Flag2 列中的标志替换为每个 ID 的 10,如下所示:

  1. 对于复制的 ID,采用最后一个时间间隔;
  2. 对于唯一 ID,请使用您拥有的时间间隔。

    我是 SAS 编程的新手。我知道我要做的是:

         data my data;
           set input;
           if Flag2 = 0 AND Flag1 = 1 then Flag2 = 10
         run; 
    

    但我不知道如何管理周期和重复的 ID。任何人都可以帮助我吗?

    标签: sas


    【解决方案1】:

    我在这里不完全确定,但我认为这就是你想要的。

    data have;
    input ID $ (Date_Start Date_End)(:date9.) Flag1 Flag2;
    format Date_Start Date_End date9.;
    datalines;
    001 13JAN2015 01JUN2018 1 0 
    001 02JUN2018 02JUL2018 1 0 
    001 03JUL2018 31DEC2020 1 0 
    002 01JAN2015 31DEC2020 1 0 
    003 01JAN2017 31DEC2019 1 0 
    003 01JAN2020 31DEC2021 1 0 
    004 01JAN2011 31DEC2021 1 2 
    ;
    
    data want;
       set have;
       by ID;
       if last.ID and flag1 = 1 and flag2 = 0 then flag2 = 10;
    run;
    

    【讨论】:

      猜你喜欢
      • 2011-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-12
      • 2018-06-07
      • 2013-11-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多