SASデータセットからユーザ定義フォーマットを作成する。

[OS]ALL
[リリース] 6.07, 6.08, 6.09, 6.10
[キーワード] base, format, procedure, cntlin=, option, datastep, start, label, fmtname, type, dataset

[質問]

SASデータセットとして作成してあるコード表から、ユーザ定義フォーマットを作れますか。

[回答]

SAS System 5では、FORMATプロシジャでVALUEステートメントを使ってユーザ定義フォーマットを作るしかありませんでした。
このため、プログラムジェネレータと呼ばれる技法を使って、DATAステップでFORMATプロシジャのステートメントを外部ファイルに書き出し、%INCLUDEステートメントでこれを読み込む方法が一般的な方法でした。
SAS System 6ではFORMATプロシジャは大幅に機能拡張され、制御データセットと呼ばれる形式のSASデータセットから、直接、ユーザ定義フォーマットを作成できます。
制御データセットとは、フォーマットを作成するための情報を持つSASデータセットのことです。
制御データセットには少なくとも次の変数が必要です。

  • START : 値範囲の始点
  • LABEL : フォーマットラベル
  • FMTNAME : フォーマット名
  • TYPE : フォーマットのタイプ(文字/数値の区別)
例えばSASデータセットSAMPLEに年齢と学年の対応を記録してあるとします。
SASデータセット"SAMPLE"    

OBS   AGE   GRADE      
     1      6   小学1年生     
     2      7   小学2年生     
     3      8   小学3年生     
     4      9   小学4年生     
     5     10   小学5年生     
     6     11   小学6年生     
     7     12   中学1年生     
     .      .          .      
次のようなDATAステップでSAMPLEを加工して制御データセットを作成し、これを FORMATプロシジャのCNTLIN=オプションで指定します。
data formdat;
    set sample(rename=(age=start grade=label));
    fmtname='agefmt';
    type='n';
  run;
  proc format cntlin=formdat;
  run;
  proc print data=sasuser.class;
    format age agefmt.;
  run;
上記のPRINTプロシジャの実行結果は、次のようになります。
   OBS    NAME       SEX       AGE        HEIGHT    WEIGHT

    1    Alice       F     中学2年生       56.5       84.0
    2    Becka       F     中学2年生       65.3       98.0
    3    Gail        F     中学3年生       64.3       90.0
    4    Karen       F     中学1年生       56.3       77.0
    5    Kathy       F     中学1年生       59.8       84.5
    6    Mary        F     高校1年生       66.5      112.0
    7    Sandy       F     小学6年生       51.3       50.5
    8    Sharon      F     高校1年生       62.5      112.5
    9    Tammy       F     中学3年生       62.8      102.5
   10    Alfred      M     中学3年生       69.0      112.5
   11    Duke        M     中学3年生       63.5      102.5
   12    Guido       M     高校1年生       67.0      133.0
   13    James       M     中学1年生       57.3       83.0
   14    Jeffrey     M     中学2年生       62.5       84.0
   15    John        M     中学1年生       59.0       99.5
   16    Philip      M     高校2年生       72.0      150.0
   17    Robert      M     中学1年生       64.8      128.0
   18    Thomas      M     小学6年生       57.5       85.0
   19    William     M     高校1年生       66.5      112.0