SAS中特定观察前后的计数

SAS中特定观察前后的计数,sas,Sas,我有这个SAS数据集: symbol date type 1010 01/01/2012 . 1010 01/02/2012 . 1010 01/03/2012 . 1010 01/04/2012 . 1010 01/05/2012 0 1010 01/06/2012 . 1010 01/07/2012 . 1202 02/26/2013 . 1202 02/27/2013 . 1202 02/28

我有这个SAS数据集:

symbol     date       type
1010    01/01/2012  .
1010    01/02/2012  .
1010    01/03/2012  .
1010    01/04/2012  .
1010    01/05/2012  0
1010    01/06/2012  .
1010    01/07/2012  .
1202    02/26/2013  .
1202    02/27/2013  .
1202    02/28/2013  0
1202    03/01/2013  .
1202    03/02/2013  .
1202    03/03/2013  .
1202    03/04/2013  .
数据集按符号和日期分组,其中符号为公司

我想使用SAS创建另一个变量
,以计算每个公司Type=0之前从-1开始的天数,Type=0之后从1开始的天数,因此新列或变量如下

symbol     date       type    count
1010    01/01/2012  .   -4
1010    01/02/2012  .   -3
1010    01/03/2012  .   -2
1010    01/04/2012  .   -1
1010    01/05/2012  0   0
1010    01/06/2012  .   1
1010    01/07/2012  .   2
1202    02/26/2013  .   -2
1202    02/27/2013  .   -1
1202    02/28/2013  0   0
1202    03/01/2013  .   1
1202    03/02/2013  .   2
1202    03/03/2013  .   3
1202    03/04/2013  .
任何帮助都将不胜感激。
谢谢

这里有一个解决方案,我做了几个假设:

  • 每个符号都有一个仅出现一次的类型值0,而所有其他值均丢失
  • Count是类型值0的日期与当前记录日期之间的天数

    /* create source data */
    data have;
    input symbol date :mmddyy10. type;
    format date date9.;
    datalines;
    1010    01/01/2012  .
    1010    01/02/2012  .
    1010    01/03/2012  .
    1010    01/04/2012  .
    1010    01/05/2012  0
    1010    01/06/2012  .
    1010    01/07/2012  .
    1202    02/26/2013  .
    1202    02/27/2013  .
    1202    02/28/2013  0
    1202    03/01/2013  .
    1202    03/02/2013  .
    1202    03/03/2013  .
    1202    03/04/2013  .
    ;
    run;
    
    /* sort data, making type value 0 the first record per symbol */
    proc sort data=have;
    by symbol descending type date; 
    run;
    
    /* calculate difference in days between records */
    data want;
    set have;
    by symbol;
    retain date_zero;
    if first.symbol then do;
        count=0; /* set first record to zero */
        date_zero=date; /* store date for calculations */
        end;
    else count=date-date_zero; /* numbers of days from first record */
    drop date_zero;
    run;
    
    /* sort data back to original order */
    proc sort data=want;
    by symbol date;
    run;
    

这几天总是连续的吗?i、 e.同一符号的两个条目之间没有遗漏日期