2015年2月5日木曜日

TRANSPOSEで転置するときラベルを付与する方法。



まずは例を見ていきましょう、

*** Sample Data ;
data DT1;
input NO:$1. MONTH:$3. YEN;
cards;
A JAN 5000
A FEB 500
A MAR 1000
B JAN 2000
B MAR 1500
;

NOMONTHYEN
AJAN5000
AFEB500
AMAR1000
BJAN2000
BMAR1500

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


ここで、以下のイメージで各預金者(NO)ごとに預金額を転置して「ついでに変数ラベルも付与したい」とします。

変数ラベルJanuaryFebruaryMarch
変数名NOJANFEBMAR

A50005001000

B20001500



この場合、TRANSPOSEで、ID, IDLABELステートメントを組み合わせれば、一発解決です。

*** ラベル用の変数を用意 ***************;
data DT2;
     length  LAB $20.;
     set DT1;
     if MONTH = "JAN" then LAB="January";
     if MONTH = "FEB" then LAB="February";
     if MONTH = "MAR" then LAB="March";
run;

LABNOMONTHYEN
JanuaryAJAN5000
FebruaryAFEB500
MarchAMAR1000
JanuaryBJAN2000
MarchBMAR1500


*** 転置 *****************************;
proc transpose  data=DT2  out=OUT1 (drop=_NAME_);

    *** 預金者毎に、預金額を転置 ;
     var  YEN;
     by   NO;

    *** 変数MONTH の値を、転置後の変数名に使う ;
     id  MONTH;
     format  MONTH;

    *** 変数LABの値を、転置後の変数ラベルに使う ;
     idlabel  LAB;

run;

変数ラベルJanuaryFebruaryMarch
変数名NOJANFEBMAR

A50005001000

B20001500


補足として、IDLABELを使う場合は、以下2点に気を付けましょう。
  • IDステートメントも同時に指定する必要がある。
  • IDステートメントとIDLABELステートメントの変数の値は、1対1になってる方が望ましい。
(以下では、MONTH="JAN"の時に、LAB="January" だったり "JAN" だったりと、1対2の関係になってしまってるので、望ましくない。)

LABNOMONTHYEN
JanuaryAJAN5000
FebruaryAFEB500
MarchAMAR1000
JANBJAN2000
MarchBMAR1500



0 件のコメント:

コメントを投稿