SAS领先函数功能的实现

2020-07-16 09:56:36 浏览数 (1)

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

  1. 双SET:
代码语言:javascript复制
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;
  1. HASH:
代码语言:javascript复制
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的操作,所以当数据集较大时建议采用第二种方法以提高效率。

0 人点赞