2019年7月5日金曜日

「ORDER=DATA」「ORDER=FREQ」の落とし穴




以前「ORDER=オプション」を紹介しました。

このオプションの「ORDER=DATA」と「ORDER=FREQ」には注意が必要です。
以下の例が想定通りの結果になるか各自確認してみてください。



「ORDER=DATA」の挙動確認

* サンプルデータ ;
data test;
input x y:$1.;
cards;
1 b
1 a
2 c
2 a
2 b
;

* PROC REPORTで「ORDER=DATA」 ;
proc report data=test;
   define x / order order=data;
   define y / order order=data;
run;

「x=2の時の順番が「c → a → b」から「b → a → c」になってしまった?」と疑問に思った方は要注意!


解説

「ORDER=DATA」は「データセットに格納されてるままの順番」に出力されると思いがちですが、
登場した値の順に並び替える」というのが正確ですね。今回の例では、

  • x=1 の時「b → a」の順に値が登場します。
  • x=2 の時「c → a → b」の順に値が登場していますが、上で既に「b → a」の順で登場しているので、「b → a → c」の順に並び替えられます。



「ORDER=FREQ」の挙動確認

* サンプルデータ ;
data test2;
input x y:$1.;
cards;
1 a
1 a
1 b
2 a
2 b
2 b
2 b
2 c
2 c
;


* PROC SUMMARYで「ORDER=FREQ」 ;
proc summary data=test2 print order=freq;
   class x y;
run;


「ORDER=FREQ」は度数が「多い」または「小さい」順に出力されます。
プロシジャごとに「多い順」か「小さい順」の設定が異なっており、

PROC FREQの場合、明示的に指定していない場合、「多い順」に並ぶ.....はずだけど、
「全然、多い順に並んでない?」と疑問に思った方は要注意!


解説

まずCLASS変数 x, y について、別々に度数を計算します。

  • x=1 の度数: 3
  • x=2 の度数: 6
    • x の度数順は「x = 2 → 1

  • y=a の度数: 3
  • y=b の度数: 4
  • y=c の度数: 2
    • y の度数順は「y = b → a → c

てことで、x =「2 → 1」、y = 「b → a → c」の順番で並び替えられます。



0 件のコメント:

コメントを投稿