SASで複数の変数の欠損の数を数えるにはcmiss関数があります。cmiss関数は便利な関数で、1obsの中で文字だろうが数字だろうが指定した変数の中の欠損の数を数えてくれます。非欠損の変数の数を数える際は、数字変数ならn関数というこれまた便利な関数があります。
一方文字変数の中で非欠損の数を数えたいときはいつも難儀していました。良い感じの関数が多分sasにはないです。あったらすみません。しょうがないので配列で数えたいうのが今回の記事です。文字変数と銘打っていますが欠測かどうかをmissing関数で調べているので、多分文字でも数字でも非欠損の数を出せると思います。文字でしか試してないのでerrorになるかもしれませんが。
対象の変数を指定している配列の部分をマクロ変数化すればいい感じのマクロになるんじゃないでしょうか?可変なのがその部分だけ、強いて言えばそこと結果を格納する変数名の部分だけなので。
data hoge ;
a = "a" ; b = "" ; c = "" ; output ;
a = "a" ; b = "b" ; c = "" ; output ;
run ;
data _null_ ;
set hoge ;
res = 0 ;
array vars a b c;
do over vars ;
if missing(vars) = 0 then res = res + 1;
end;
putlog res = ;
run;
/*>>>>>---------- 以下実行log ----------<<<<<*/
3956
3957 data _null_ ;
3958 set hoge ;
3959
3960 res = 0 ;
3961 array vars a b c;
3962 do over vars ;
3963 if missing(vars) = 0 then res = res + 1;
3964 end;
3965
3966 putlog res = ;
3967
3968 run;
res=1
res=2