2017年5月23日火曜日

REPORTプロシジャ入門10:数値変数の落とし穴



前提知識として、まず以下リンク記事をご覧ください。
REPORTプロシジャ入門4:集計【ANALYSIS】




では、落とし穴の例を見ていきましょう。


落とし穴の例


データセットSASHELP.CLASS の NAME, AGE をREPORTプロシジャで出力してみます。

* 例① ;
proc report data=SASHELP.CLASS nowd;
   column NAME AGE;
   define NAME / "名前";
   define AGE  / "年齢";
run;


まぁ、これは特におかしなところはないですね。
では以下のように年齢だけ出力してみるとどうでしょうか?


* 例② ;
proc report data=SASHELP.CLASS nowd;
   column AGE;
   define AGE  / "年齢";
run;


「あれ?1行しか出力されていないうえ、年齢「253」てなんだよ!」って感じですよね。




解説


実は、REPORTプロシジャに指定した ”数値変数” は、以下青字のように「analysis sum」オプションをSASが裏で勝手につけて実行しています。

proc report data=SASHELP.CLASS nowd;
   column AGE;
   define AGE  / analysis sum "年齢";
run;


つまり、AGEを合計して「253」という出力になってしまったわけですね。


以下のように「display」オプションを明示的につければ、この勝手な挙動を制御できます。

proc report data=SASHELP.CLASS nowd;
   column AGE;
   define AGE  / display "年齢";
run;



ちなみに最初の例①の場合は、SASが裏で以下青字のように判断して実行します。

proc report data=SASHELP.CLASS nowd;
   column NAME AGE;
   define NAME / display "名前";
   define AGE    / analysis sum "年齢";
run;


文字変数の場合は特にこちらで明示しない場合「display」が勝手につくわけです。

つまり挙動として、数値変数 AGE だけだと合計してしまうけど、文字変数 NAME を「display」オプションでそのまま表示するようにしているから、AGE も合計されなくて済んでるっていう仕組みです。
(AGE が「全ての行」の合計ではなく、行ごとに「その行の1つの数値だけ」で合計する、という意味のない動きになっていて、結果的に格納値そのままの値になる)



9.特定セルの書式設定【CALL DEFINE】
10:数値変数の落とし穴

0 件のコメント:

コメントを投稿