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

  • 本文关键字:余额 SAS id 何计算 计算 sas
  • 更新时间 :
  • 英文 :


我的数据如下:

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

现在我想要 id 1 在三月份处于正 bal 中的天数和 id 处于负 bal 的天数。 例如,正天数将计算为013月06日之后,因为第一个负条目出现在073月,因此6天。 然后它又在 14 到 24 那 11 天继续正巴尔 所以总的来说是 6+11=17 天是正数。

负球也是如此。

我尝试使用以下代码:

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

但无法得到确切的结果。 任何帮助都将得到认可。

假设您的数据按iddate排序。

首先做一个"前瞻"合并(以获得下一个日期(:

数据展望 ; 合并有 有 (firstobs=2 rename=(date=nextdate id=nextid(( ; 如果 id ^= nextid 则调用 missing(nextdate( ; 删除下一个 ID ; 跑;/* 数据现在如下所示 */ID 余额日期 下一个日期 1 10 022018年3月05日 1 12 05Mar2018 07Mar2018 1 -15 07Mar2018 14Mar2018 1 14 14Mar2018 25Mar2018 1 -25 25Mar2018

然后,展开缺少的日期,处理每个 id 的第一个日期不是一个月的 1 号,并且每个 id 的最后一条记录不是该月的最后一天的情况:

数据展开 ; 设置前瞻(重命名=(日期=此日期(( ; 按 ID ; 如果 first.id 和 day(thisdate( ^= 1 则做 ;/* 从每月 1 号循环到日期前一天,输出每个日期的新记录 */do date = intnx('month',thisdate,0,'b'( to thisdate - 1 ; 输出; 结束; 结束;/* 输出输入记录 */日期 = 此日期 ;输出;/* 输出日期到下一个日期 */如果下一个日期>这个日期 + 1 则做 ; do date = thisdate + 1 to nextdate - 1 ; 输出; 结束; 结束; 还/* ID 的最后一条记录,循环到月底 */如果缺少(下一个日期(和这个日期^= intnx('月',这个日期,0,'结束'(,则做; do date = thisdate + 1 to intnx('month',thisdate,0,'end'( ; 输出; 结束; 结束; 删除此日期下一个日期; 格式化日期日期9。; 跑;/* 数据现在如下所示 */身份证余额日期      1 10 01Mar2018 1 10 02Mar2018 1 10 03Mar2018 1 10 04Mar2018 1 12 05Mar2018 1 12 06Mar2018 1 -15 07三月2018 1 -15 08Mar2018 ...等。。。 1 -15 13Mar2018 1 14 14Mar2018 1 14 15Mar2018 ...等。。。 1 14 24Mar2018 1 -25 25Mar2018 ...等。。。 1 -25 31Mar2018

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

最新更新