2015年11月12日木曜日

REPORTプロシジャ入門3:並べ替えとグループ化【ORDER, GROUP】




サンプルデータ

data DT1;
input NO$ NO2$ A @@;
cards;
002 1 10  002 1 20  002 2 30  002 2 40
001 1 50  001 1 60  001 2 70  001 2 80  . . .
;





行の並べ替え

proc report data=DT1 nowd spanrows;
   column  NO NO2 A;
   define  NO  / order ;
   define  NO2 / order ;
   define  A   / display ;
run;



ORDER を指定した変数で行を並べ替えます。

ポイント
  • 以下のように、ORDER変数で同じ値が繰り返す部分は空白表示になる(左から2つ目の表)
  • この部分は「SPANROWS」で、単一のセルにまとめられる(左から3つ目の表。このオプションはODS出力の種類によってサポートされていなかったり、挙動が異なるので注意)

  • ORDER変数の元々の格納値が欠損値だと、その行は出力から除外される(欠損値の行も出力する方法は下のほうで解説)



行のグループ化

proc report data=DT1 nowd spanrows;
   column  NO NO2;
   define  NO  / group ;
   define  NO2 / group ;
run;



GROUP を指定した変数でグループ化(組み合わせ毎に1行化)します。

ポイント
  • ORDERのところで説明したポイントと同じ
  • あと、同じPROC REPORT内で、GROUP変数のほかにDISPLAY変数も設定した場合、グループ化出来ない&NOTEメッセージが表示されるので、取り扱い注意!



欠損値の出力


ORDER, GROUP,(あと別記事で解説しているACROSS)を指定した変数の元々の格納値が欠損値だと、その行は出力から除外されます。

以下2つの方法で欠損値の行も出力可能です。


方法1

PROC REPORTステートメントに「MISSING」を指定する。
この方法は、PROC REPORT内の全ORDER, GROUP, ACROSS変数に対して効力がある。

proc report data=DT1 nowd spanrows missing;
   column  NO NO2 A;
   define  NO  / order ;
   define  NO2 / order ;
   define  A   / display ;
run;




方法2

DEFINEステートメントに「MISSING」を指定する。
この方法は、MISSINGを指定したDEFINEステートメント内のみに効力がある。

proc report data=DT1 nowd spanrows;
   column  NO NO2 A;
   define  NO  / order missing;
   define  NO2 / order missing;
   define  A   / display ;
run;

(気をつけたいのが、例えばX, YというORDER変数があったとして、XにはMISSINGを指定して、Yには指定しなかった場合、、Xの格納値がなんであろうと、Yの元々の格納値が欠損値だとその行は出力から除外されます)



注意点


SASのマニュアルに今後のリリースで設定を変更するかもという注意があったので、2015/11/12時点での話になりますが、ORDER, GROUP, ACROSSを指定した変数は「ORDER=FORMATTED」という、データの並べ替えの方法が裏で設定されていて、これがちょっと混乱を招くおそれがあります。

以下記事をご覧ください。

0 件のコメント:

コメントを投稿