2026年5月4日月曜日

複数の文字変数の非欠損の数を数える話

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

0 件のコメント:

コメントを投稿