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

2020-07-16 09:55:45 浏览数 (1)

前几天看到一个群友提的一个问题:求上图中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的操作,所以当数据集较大时建议用第二种方法以提高效率。

0 人点赞