前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SAS领先函数功能的实现

SAS领先函数功能的实现

作者头像
专业余码农
修改2020-07-16 09:56:36
9570
修改2020-07-16 09:56:36
举报
文章被收录于专栏:老Z的博客
lead
lead

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的操作,所以当数据集较大时建议采用第二种方法以提高效率。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-10-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档