2017年4月10日月曜日

変数「_NAME_」「_LABEL_」があるとPROC TRANSPOSEの挙動が変わる


以下をご覧ください。

例①
* サンプルデータ ;
data DT1;
   A=1; output;
   A=2; output;
run;
  A   
  1 
  2 


* TRANSPOSE ;
proc transpose data=DT1 out=OUT1;
  var A;
run;
 _NAME_ 
  COL1  
  COL2  
  A   1   2 

TRANSPOSEで変数Aを横に転置しています。


では上記のサンプルデータに以下の_NAME_という変数を追加して、再度同じようにTRANSPOSEしてみます。

例②
* サンプルデータ ;
data DT2;
  A=1; _NAME_="aa"; output;
  A=2; _NAME_="bb"; output;
run;
  A   
  _NAME_   
  1   aa 
  2   bb


* TRANSPOSE ;
proc transpose data=DT2 out=OUT2;
 var A;
run;
 _NAME_ 
  aa  
  bb  
  A   1   2 

例①の結果と異なっているのがお分かりいただけますか。
例①では変数名が「COL1」「COL2」だったのが、例②では「aa」「bb」という変数名になりました。

まるで以下のようにIDステートメントを使ったような挙動ですね。

proc transpose data=DT2 out=OUT2;
  var A;
  id _NAME_;
run;

実はTRANSPOSEするデータセットに「_NAME_」という変数があって、IDステートメントも未指定の場合、勝手に上記青文字の処理がされるようになっています。


では次は「_LABEL_」という変数を追加して、同様にTRANSPOSEしてみます。

例③
* サンプルデータ ;
data DT3;
  length A 8. _NAME_ $2. _LABEL_ $20.;
  A=1; _NAME_="aa"; _LABEL_="あああ"; output;
  A=2; _NAME_="bb"; _LABEL_="いいい"; output;
run;
  A   
  _NAME_   
  _LABEL_  
  1   aa   あああ
  2   bb  いいい


* TRANSPOSE ;
proc transpose data=DT3 out=OUT3;
 var A;
run;
 前の変数名 
  あああ 
  いいい  
 _NAME_ 
  aa  
  bb  
  A   1   2 
※1段目が変数ラベル、2段目が変数名



結果を見ると変数ラベルがついています。まるで以下のように書いたときの挙動ですね。

proc transpose data=DT3 out=OUT3;
  var A;
  id _NAME_;
  idlabel _LABEL_;
run;

これも「_LABEL_」という変数があって、IDLABELステートメントも未指定の場合、勝手に上記赤文字の処理がされるようになっています。

これを「勝手なことしやがって!」と思うか、「便利だな」と思うかケースバイケースですね。

以下記事のように2回TRANSPOSEを実行する場合は特に気をつけましょう。
TRANSPOSEの2回実行テクニック。


0 件のコメント:

コメントを投稿