仕様
配列とループ処理を組み合わせることで、複数の変数に一括で同じ処理を行うマクロ変数。
例えば、変数A, B, C, Dそれぞれの欠測値をすべてUN(Unknown)に置き換えるときに使用する。
同じ処理を行う仕様のため、複数の変数同じ型であることが前提である。
コード
chgVarsValue.sas
/*
* Argument description
* type[num]: if target variable is character, type = 1. else any values.
* tgtVal[num/chr]: Target value. if type=1, this argument needs double quotations.
* outVal[num/chr]: Output value. if type=1, this argument needs double quotations.
* chgVars[chr]: Target variables. Enter with a space separater.
*/
%macro chgVarsValue(type, bf, af, chgVars);
%if &type. = 1 %then %let _type=$;
%else _type=;
array chgvv(*) &_type. &chgVars.;
do _z = 1 to dim(chgvv);
if chgvv(_z) = &bf. then chgvv(_z) = &af.;
end;
drop _z;
%mend chgVarsValue;
処理内容
前述のように、変数A, B, C, Dそれぞれの欠測値をすべてUN(Unknown)に置き換える場合は次のように引数を指定する。
Example01.sas
%chgVarsValue(1, "", "UN", A B C D)
引数type
で型を指定する必要があるのは、arrayステートメントで配列に変数を定義する際に、文字型の場合は変数名の前に"$"が必要であるためです。
つまり、type=1の場合はarray chgvv(*) $ A B C D
となり、それ以外の場合(数値型の場合)はarray chgvv(*) A B C D
となります。
配列に指定された変数はすべてループで順番に同じif文の処理が実行され、引数bf
で指定された値から引数af
で指定された値に変換されます。
実行結果
マクロchgVarsValueの使用例と実行結果(データセットresult)です。
Example02.sas
data sample;
AA = "abc"; BB = "efg"; CC = "hij"; output;
AA = ""; BB = "efg"; CC = "hij"; output;
AA = "abc"; BB = ""; CC = "hij"; output;
AA = "abc"; BB = "efg"; CC = ""; output;
AA = "abc"; BB = ""; CC = ""; output;
AA = ""; BB = "efg"; CC = ""; output;
AA = ""; BB = ""; CC = "hij"; output;
AA = ""; BB = ""; CC = ""; output;
run;
data result;
set sample;
%chgVarsValue(1, "", "UN", AA BB CC);
run;