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;

「全然、度数が多い順に並んでない?」と疑問に思った方は要注意!


解説

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

  • x=1 の度数: 3
  • x=2 の度数: 6
    • x の値で度数が多い順は「2 → 1

  • y=a の度数: 3
  • y=b の度数: 4
  • y=c の度数: 2
    • y の値で度数が多い順は「b → a → c

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



0 件のコメント:

コメントを投稿