我的数据如下:
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;
但是无法获得确切的结果。 任何帮助都会得到申请。
答案 0 :(得分:0)
假设您的数据按id
和date
排序。
首先进行“预视”合并(以获取下一个日期):
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 /月对它们进行计数。