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