マクロプログラムを作成して、複数の変数の値をグループ内の以前の欠損値で置き換える前に、複数の変数を順番に使用してデータセットをソートする必要がありますすべての観察を特定する。欠損値をマクロに置き換えます
私は、テストデータセットがあります。
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と国番号でソートする必要があります。 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)`
これは面倒です。 タスクを処理できません。 sortを使用するby-variablesの数は 'replace'変数の数と異なる可能性があるためです。私は、マクロがさまざまな機会に適用されることを願っています。ソートを使用するidvarsの数は、 'replace'変数の数よりも多くなることがあります。時には前者は後者よりも小さくなることがあります。
私の問題を説明できることを願っています。ありがとう。
ありがとうございました!私は私の問題を解決しました。 – JNWong