由于我想制作一个宏程序来替换多个variable'missing值,它们之前的组中没有缺失的值,在此之前我需要按顺序使用多个变量对数据集进行排序以确定每一个观察。用宏替换缺失值
我有一个测试数据集:
data temp2;
input countryname $1-5 +1 countrycode $7-8 +1 dev 1. +1 legal 1. +1 audit 1.;
datalines;
china 22 9 2 3
china 22 . . 3
china 22 7 3 .
china 21 4 . .
japan 13 3 . 1
japan 12 3 . .
japan 13 1 2 3
;
run;
正如你所看到的,我需要和COUNTRYNAME COUNTRYCODE进行排序。并替换缺失值dev
legal
audit
。我试过一个宏,如:
`%macro replace(dsetin=,dsetout=,idvars=,vars=);
%if &dsetout = %then %let dsetout = &dsetin;
%let char=_;
%do xi=1 %to %sysfunc(countw(&vars));
%let var = %scan(&vars,&xi);
%let _VARs_=%sysfunc(cat(&char,&var));
%end;
%let m=%sysfunc(countw(&vars));
%do yi=1 %to %sysfunc(countw(&idvars));
%let idvar = %scan(&idvars,&yi);
%let lagid = lag(&idvar);
%end;
%let n=%sysfunc(countw(&idvars));
proc sort data=&dsetin out=temp1;
by &idvars;
run;
data &dsetout;
set temp1;
by &idvars;
array id(&n)&idvar;
array lag(&n)&lagid;
array vara(&m)&var;
array vars(&m)&_VARs_;
do yi = 1 to &n;
if lag(yi)=id(yi) then do;
do xi= 1 to &m;
retain &_VARs_;
if not missing(&var) then &_VARs_ =&var;
else &var = &_VARs_;
end;
%end;
end;
drop of &_VARs_:;
run;
%mend replace;
%replace(dsetin=temp,dsetout=temp2,idvars=countryname countrycode,vars=DEV LEGAL AUDIT)`
看起来很乏味。 我无法处理任务。由于使用排序的副变量的数量可能与“替换”变量的数量不同。我希望这个宏可以适用于不同的场合。有时使用排序的idvars的数量可能比'replace'变量的数量多。有时前者可能比后者少。
希望它能说明我的问题。谢谢。
谢谢!我已经解决了我的问题。 – JNWong