2015年1月30日金曜日

TRANSPOSEのIDステートメント入門




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
;

NOMONTHYEN
A15000
A2500
A31000
B12000
B31500

サンプルは、各預金者(NO)に対する、月別(MONTH)の預金額(YEN)だとします。


*** プログラム①  ;
proc transpose data=DT1 out=OUT1;
   var YEN;
   by NO;
run;

NO_NAME_COL1COL2COL3
AYEN50005001000
BYEN20001500


*** プログラム②  ;
proc transpose data=DT1 out=OUT2;
   var YEN;
   by NO;
   id MONTH;
run;

NO_NAME__1_2_3
AYEN50005001000
BYEN20001500


解説

プログラム①
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
M2 500
M3 1000
M1 2000
M3 1500
;

NOMONTHYEN
AM15000
AM2500
AM31000
BM12000
BM31500

proc transpose data=DT2 out=OUT3;
   var YEN;
   by NO;
   id MONTH;
run;

NO_NAME_M1M2M3
AYEN50005001000
BYEN20001500



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
;

NOMONTHYEN
AJAN5000
AFEB500
AMAR1000
BJAN2000
BMAR1500

proc transpose data=DT3 out=OUT4;
   var YEN;
   by NO;
   id MONTH;
run;

NO_NAME_JANFEBMAR
AYEN50005001000
BYEN20001500


上の例では、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 件のコメント:

コメントを投稿