TRANSPOSEはデータを転置するプロシジャです。
今回は質問をよく頂く、IDステートメントの使い方を中心にまとめてみました。
注意:
TRANSPOSEの「IDステートメント」は、 システムオプション「VALIDVARNAME」の設定により挙動が変わります。今回は「VALIDVARNAME=V7」としている場合の例になります。
基本構文:
PROC TRANSPOSE DATA=対象データセット OUT=出力データセット ; VAR 転置する変数 ; BY BY変数 ; ID ID変数 ; RUN; |
まずは、例を見ていきましょう。
*** サンプルデータ ; data DT1; input NO$ MONTH YEN; cards; A 1 5000 A 2 500 A 3 1000 B 1 2000 B 3 1500 ;
|
サンプルは、各預金者(NO)に対する、月別(MONTH)の預金額(YEN)だとします。
*** プログラム① ; proc transpose data=DT1 out=OUT1; var YEN; by NO; run;
*** プログラム② ; proc transpose data=DT1 out=OUT2; var YEN; by NO; id MONTH; run;
|
解説
プログラム①
NO毎に、YENを横に転置してます。
プログラム②
プログラム①に似た結果ですが、異なるのは、転置後の変数名と1500円の位置。
これはIDステートメントの機能で、ID変数の値を変数名に割り当てているからです。
今回の例では、
MONTH=1 の時、変数名「_1」、
MONTH=2 の時、変数名「_2」、
MONTH=3 の時、変数名「_3」に、転置するYENの値をはめ込んでいってます。
ポイントと注意点
今回の例のポイントとして、MONTHの値をそのまま変数名にすると、「1」「2」「3」となって、変数名の命名規則に反してるので、先頭にアンダーバーがついた「_1」「_2」「_3」という変数名になります。
(命名規則に反している箇所は「_」「P」「N」「D」などのSASが決めた文字で埋められます)
命名規則に反しているかどうかの判断はシステムオプション「VALIDVARNAME」の設定によるので、この設定次第で挙動が変わります。
以下のように、MONTHの値がもし、「M1」「M2」「M3」とかだと、命名規則に則してるので、転置してもそのまま「M1」「M2」「M3」という変数が出来ます。↓↓
*** サンプルデータ ; data DT2; input NO$ MONTH$ YEN; cards; A M1 5000 A M2 500 A M3 1000 B M1 2000 B M3 1500 ;
proc transpose data=DT2 out=OUT3; var YEN; by NO; id MONTH; run;
|
1つ気をつけるのが、IDステートメントの変数にformatが割り当てられてる場合です。
なぜなら、formatをあてたときの値が、転置後の変数名になってしまうからです。↓↓*** サンプルデータ ; proc format; value MONTH_ 1 = "JAN" 2 = "FEB" 3 = "MAR" ; run; data DT3; input NO$ MONTH YEN; format MONTH MONTH_.; cards; A 1 5000 A 2 500 A 3 1000 B 1 2000 B 3 1500 ;
proc transpose data=DT3 out=OUT4; var YEN; by NO; id MONTH; run;
|
上の例では、formatをあてたID値「JAN」「FEB」「MAR」を転置後の変数名にしようとします。
format値ではなく、変数値をID値としたい場合、以下のようにformatを除いてあげればOK。
proc transpose data=DT3 out=OUT4; var YEN; by NO; id MONTH; format MONTH ; run; |
最後にもうひとつ注意点。
転置後の変数名に割り当てる「ID値」が長すぎる場合、ID値を途中で切った値を転置後の変数名として割り当てます。
ID値を何バイトで切ってしまうのかは、環境やバージョンによって異なると思うので、詳細はリファレンスを参照ください。
0 件のコメント:
コメントを投稿