2014年2月17日月曜日

FORMATプロシジャの小技



フォーマットの中にフォーマットを指定することができる面白い小技。
どういう事かまとめてみました。



サンプルデータ作成

proc format ;
   value SEX_
     1 = "男性"
     2 = "女性"
   ;
run;

data DT1;
  format V1 SEX_. ;
  V1 = 1;  output ;
  V1 = 2;  output ;
  V1 = .;   output ;
run;




変数「V1」にフォーマット「SEX_」を割り当てています。



小技使用例


上のサンプルで例えば、、「V1」がNULLなら ”未記載” と表示したいとする。
その場合、”未記載”を含めた新たなフォーマットを作成するため、、

proc format ;
   value SEX2_
     1 = "男性"
     2 = "女性"
     .  = "未記載"
   ;
run;



と書くけど、以下のようにも書ける。

proc format ;
   value SEX2_
     . = "未記載"
     other = [SEX_.]
   ;
run;




解説

上記例では、フォーマット「SEX2_」を作成し、
NULLの場合、”未記載”と表示させ、
それ以外は、フォーマット「SEX_」の内容を適用させてる。


注意点としては、ログに以下のようなメッセージがでる。

NOTE: SEX_入出力形式が等号(=)の右側に指定されましたが、
      長さの指定がありません。 PROC FORMATは生成される入出力形式の標準の長さを40と仮定しました。
      十分な長さでない場合は、SEX_入出力形式に長さを指定し、 PROC FORMATを再実行するか、
      十分なDEFAULT=オプションを指定してください。


ざっくり言うと、
”「SEX2_」から「SEX_」を参照する時は表示する文字の長さを「40」で切るね。”
と言ってます。


今回「SEX_」は”男性”と”女性”で文字の最大長さは「4」なので、支障がないから上記メッセージは無視して構わない。

もし長さが40を超える場合や、上記のメッセージが嫌という場合は、
フォーマット名に長さの指定を加えて、「SEX_4.」とすればよい。

proc format;
 value SEX2_
 . = "未記載"
 other = [SEX_4.]
 ;
run;



まとめ

FORMATプロシジャ内で、値ごとに適用させるフォーマットを設定できるので、
色々な使い方ができ、覚えておくと便利な小技です。

0 件のコメント:

コメントを投稿