前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SAS数据集中一行与多行的比较

SAS数据集中一行与多行的比较

作者头像
专业余码农
修改2020-07-16 09:55:45
1.4K0
修改2020-07-16 09:55:45
举报
文章被收录于专栏:老Z的博客
Compare
Compare

前几天看到一个群友提的一个问题:求上图中X小于等于所有Y值的个数。比如,第一个Y为0,则5个X中小于等于0的个数为0。实现这一目的的方法有多种,最易懂的方法应该是转置加数组,下面介绍其他两种方法:

  1. 双SET:
代码语言:javascript
复制
data have;
    input ID X Y;
cards;
1 1000 0
2 2000 0
3 3000 3000
4 4000 3500
5 5000 4000
;

data want;
    set have nobs=totobs;
    NUM=0;
    do i=1 to totobs;
        set have(keep=X rename=X=X_) point=i;
        if X_ <= Y then NUM=NUM+1; 
    end ;
    drop X_;
    output;
run;
  1. HASH,程序(SAS9.2+)如下:
代码语言:javascript
复制
data have;
    set have;
    BYVAR=1;
run;

data want;
    if _n_=1 then do;
        dcl hash h(dataset:'have(keep=BYVAR X rename=X=X_)', multidata: 'y');
        h.definekey('BYVAR');
        h.definedata(all:'y');
        h.definedone();
        call missing(X_);
    end;
    set have;
    NUM=0;
    rc=h.find();
    do while(rc=0);
        if X_ <= Y then NUM=NUM+1; 
        rc=h.find_next();
    end;
    drop BYVAR X_ RC;
run;

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

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

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

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

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

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