2016年8月4日木曜日

変数ラベルを取得するVLABEL関数と実践例


VLABEL関数で変数ラベルを取得することが出来ます。
(変数にラベルが割り当てられていない場合は、変数名が返されます)



構文


   VLABEL( 変数名 )






* サンプルデータ作成 ;
data DT1;
    label A="あああ";
    do A=1 to 3;
       output;
    end;
run;
 A (あああ)  
   1  
   2 
   3 


* 変数Aのラベルを取得 ;
data DT2;
    set DT1;
    length  LAB  $50.;
    LAB = vlabel(A);
run;
 A (あああ)  
  LAB   
   1    あああ  
   2   あああ 
   3   あああ 



実践例

実際質問を頂いてVLABEL関数が活躍した例を紹介します。


以下は患者毎に、該当する疾患(A1~A3)に「1」を入れているデータです。

* サンプルデータ作成 ;
data DT1;
label NO="患者ID" A1="高血圧" A2="高脂血症" A3="糖尿病";
input NO$ A1 A2 A3;
cards;
001 1 . 1
002 . . .
003 . 1 .
;
run;
 NO (患者ID)  
 A1 (高血圧)  
 A2 (高脂血症)  
 A3 (糖尿病)  
   001     1     .     1  
   002    .     .     .  
   003    .     1     .  


このデータから以下のように 「該当する疾患名をカンマで区切って文字化した変数A」 を作りたいとします。
 NO (患者ID)  
 A1 (高血圧)  
 A2 (高脂血症)  
 A3 (糖尿病)  
 A  
   001     1     .     1   高血圧, 糖尿病 
   002    .     .     .    
   003    .     1     .   高脂血症 


解決案
data DT2;
   set DT1;

   length A $200.;
   array AR(*) A1 A2 A3;

   do i=1 to dim(AR);
       if AR(i)=1 then A=catx(", " , A, vlabel(AR(i)) );
   end;

run;
 NO (患者ID)  
 A1 (高血圧)  
 A2 (高脂血症)  
 A3 (糖尿病)  
 A  
   001     1     .     1   高血圧, 糖尿病 
   002    .     .     .    
   003    .     1     .   高脂血症 



上記プログラムを理解するうえで参考になりそうな記事

配列(ARRAYステートメント)入門
区切り文字をつけて変数値同士を結合する【CATX関数】



0 件のコメント:

コメントを投稿