SAS保留声明无法正常工作

时间:2018-02-27 22:55:32

标签: sas

我有以下数据集

data have;
input SUBJID VISIT$ PARAMN  ABLF$ AVAL;
cards;
        1   screen      1   .       151
        1   random      1   YES     .
        1   visit1      1   .       .
        1   screen      2   .       65.5
        1   random      2   YES     65      
        1   visit1      2   .       .
        1   screen      3   .       .
        1   random      3   YES     400
        1   visit1      3   .       420
;
run;

我想创建另一个名为BASE的变量,该变量在AVAL时捕获ABLF=YES的值(当存在实际值时),然后将其向下拖动直到新的遇到PARAMN

基本上我希望输出看起来像这样

 SUBJID  VISIT$  PARAMN  ABLF$  AVAL BASE;

    1   screen      1   .       151     .
    1   random      1   YES     .       .
    1   visit1      1   .       .       .
    1   screen      2   .       65.5    65
    1   random      2   YES     65      65
    1   visit1      2   .       .       65
    1   screen      3   .       .       400
    1   random      3   YES     400     400
    1   visit1      3   .       420     400

我使用了以下代码

data want;
set have;
by SUBJID PARAMN;
if first.PARAMN and ABLF=' ' then BASE=.;
if ABLF='YES' then BASE=AVAL;
retain BASE;
run;

然而,当我运行这个时,我的数据看起来并不像我想要的那样

2 个答案:

答案 0 :(得分:2)

RETAIN看起来不像是正确的工具。 RETAIN只能在文件中向前移动数据。它无法向后移动。

看起来只有一个带有“BASE”值的观察值。所以只需将它合并回数据即可。

data want;
  merge have
        have(keep=subjid paramn aval ablf rename=(aval=BASE ablf=xx)
             where=(xx='YES'))
  ;
  by SUBJID PARAMN;
  drop xx;
run;

答案 1 :(得分:0)

Pro SQL:

proc sql;
   select a.*,b.aval as BASE from have a left join have(drop=visit where=(ablf='YES')) b
   on a.subjid=b.subjid and a.paramn=b.paramn;
quit;

Double do loop:

data want;
    do until(last.visit);
    set have;
    retain temp;
    by subjid paramn notsorted;
    if ablf='YES' then temp=aval;
    end;
    do until(last.visit);
    set have;
    by subjid paramn notsorted;
    base=temp;
    end;
    drop temp;
run;