如何计算天数id在SAS中有正余额和负余额

时间:2018-10-16 17:39:50

标签: sas

我的数据如下:

id   balance  date
1     10      02Mar2018
1     12      05Mar2018
1    -15      07Mar2018
1     14      14Mar2018
1    -25      25Mar2018

现在,我希望在游行月份,id 1的天数为正值,而id为负的天数。 例如,正日期的天数将在3月1日至3月06日之后进行计算,因为3月7日是第一个负条目,因此为6天。 然后它又在11天的14到24之间继续上升 因此总共有6 + 11 = 17天为阳性。

对于负平衡也是如此。

我尝试使用以下代码:

DATA B;
SET A ;
BY ID;
IF FIRST.ID THEN Y=DATE;
RETAIN Y;
ELSE Y=INTCK('day',DATE,Y);
RUN;

但是无法获得确切的结果。 任何帮助都会得到申请。

1 个答案:

答案 0 :(得分:0)

假设您的数据按iddate排序。

首先进行“预视”合并(以获取下一个日期):

data lookahead ;
  merge have
        have (firstobs=2 rename=(date=nextdate id=nextid)) ;

  if id ^= nextid then call missing(nextdate) ;
  drop nextid ;
run ;

/* data now looks like this */
id   balance  date      nextdate
1     10      02Mar2018 05Mar2018
1     12      05Mar2018 07Mar2018
1    -15      07Mar2018 14Mar2018
1     14      14Mar2018 25Mar2018
1    -25      25Mar2018

然后,扩展缺少的日期,处理每个ID的第一个日期不是一个月的第一天,每个ID的最后一个记录不是该月的最后一天的实例:

data expand ;
  set lookahead (rename=(date=thisdate)) ;
  by id ;

  if first.id and day(thisdate) ^= 1 then do ;
    /* loop from 1st of month to day before date, output new record for each date */
    do date = intnx('month',thisdate,0,'b') to thisdate - 1 ;
      output ;
    end ;
  end ;

  /* output the input record */
  date = thisdate ; output ;

  /* output dates up to the next date */
  if nextdate > thisdate + 1 then do ;
    do date = thisdate + 1 to nextdate - 1 ;
      output ;
    end ;
  end ;
  else 
  /* last record for id, loop to end of month */
  if missing(nextdate) and thisdate ^= intnx('month',thisdate,0,'end') then do ;
    do date = thisdate + 1 to intnx('month',thisdate,0,'end') ;
      output ;
    end ;
  end ;

  drop thisdate nextdate ;
  format date date9. ;
run ;

/* data now looks like this */
id   balance  date      
1     10      01Mar2018
1     10      02Mar2018
1     10      03Mar2018
1     10      04Mar2018 
1     12      05Mar2018
1     12      06Mar2018 
1    -15      07Mar2018
1    -15      08Mar2018
... etc ...
1    -15      13Mar2018 
1     14      14Mar2018
1     14      15Mar2018
... etc ... 
1     14      24Mar2018
1    -25      25Mar2018
... etc ...
1    -25      31Mar2018

现在应该相对容易地标记相应的值,并按id /月对它们进行计数。