全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
2541 2
2015-04-14
data tm;
  length id $ 12;
  input date:yymmdd10. id $ name $ @@;
cards;
2012-5-31        PID000100282        马梅
2012-6-1        PID000100282        马梅
2012-6-2        PID000100282        马梅
2014-7-15        PID000100445        朱文
2012-10-30        PID000101056        骆超
2013-3-30        PID000101493        许荣
2013-4-6        PID000101493        许荣
2013-4-8        PID000101493        许荣
2013-4-9        PID000101493        许荣
;
run;

*查询连续3天及以上的数据;
proc sort data=tm;
  by id date;
run;
data over3;
  set tm;
  by id date;
    y=dif(date);
      if first.id then do;
          x=0; end;
        else x=dif(date);
*format date yymmdd10.;
run;
proc print;
run;
/***********
我的思路是,按id分组
在组内第一个观测x=0,组内第二个观测x=第一个date-第二个date
通过x的值是不是=1 来判断数据是否连续
不明白为什么,y=dif(date)正常,x=dif(date)无效???

此外,请问解决这种连续日期问题的算法,越多越好!谢谢
***********/


二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2015-4-15 10:17:35
dif函数和if/else语句一起使用的话有些tricky。你可以搜搜相关文章,在没搞清楚原理前,尽量不要这样用。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2015-4-15 22:14:34
找了一些资料,发现lag函数的运行机制大概是这样:
1.lag(x)是一个队列(queue)函数,每次执行,从队列的起始读取数值并将该值移除出队列,队列中的剩余值上移,x的当前值进入队列末尾。因此首次执行后,lag(x)值为missing,队列中只有1个值--即x的当前值。

2.只有当lag(x)被执行后,x的当前值才会被读入队列中。因此,如果使用条件语句,不符合条件时,lag(x)不被执行,当前的x值也不会进入队列,从而不会出现在lag(x)的结果中。

3.尽量不要在中间使用if语句跳过lag(x),这样会使结果不容易控制(系统会顺延一个值,然后跳过值,如示例中z6所示)。

4.SAS语句内的lag函数是无关的,即使执行的是同样的lag(x)。(如示例中多个lag(x)的结果互补相关)

5.不要试图用b=lag(b)+x来进行累积运算,用b+x代替。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群