SAS领先函数功能的实现

lead

SAS程序猿/媛都知道SAS有滞后函数LAG。那我们会问有没有与之相反的领先函数呢?答案是否定的。但是,我们有其他的替代方法。最简单的方法就是新建一个值为_N_的排序变量,然后逆向排序,使用LAG函数,再正向排序。方法虽然简单明了,但是要多个PROC+DATA步,而且数据较大时,效率会很低。下面介绍其他两种方法:

  1. 双SET:
    data demo;
        input X @@;
    cards;
    1 2 3 4 5 6
    ;
    run;
    
    data lead;
        set demo end=eod;
        LAG=lag(X);
        if not eod then do;
            VAR_TEMP=_N_+1;
            set demo(keep=X rename=X=LEAD) point=VAR_TEMP;
        end;
        else LEAD=.;
        keep X LAG LEAD;
    run;
    
  2. HASH
    data lead;
        retain X;
        if _N_=1 then do;
            dcl hash h(ordered: 'a') ;
            h.definekey('LEAD_SEQ');
            h.definedata('LEAD_SEQ', 'LEAD');
            h.definedone();
            dcl hiter hi('h');
            
            do  until(eof);
                set demo(rename=X=LEAD) end=eof;
                LEAD_SEQ+1;
                h.add();
            end;
        end;
        set demo;
        LAG=lag(X);
        hi.setcur(key: _N_); /*Specifies a starting key item for iteration*/
        rc=hi.next();
        if rc^=0 then LEAD=.;
        drop LEAD_SEQ RC;
    run;
    

上面第一种方法程序行数虽然少,但是有两次SET的操作,所以当数据集较大时建议采用第二种方法以提高效率。

曾宪华 /
本文采用 署名-非商业性使用-相同方式共享 3.0许可协议 属于 程序人生 分类, 被贴了 LAG LEAD HASH 书签

上一篇 SAS成语接龙
下一篇 SAS求子集