制御データセットから範囲指定のフォーマットを作成する方法

[OS] ALL
[リリース] 6.12, 8.2
[キーワード] FORMAT, CNTLIN

[質問]

制御データセットを使って、数値変数に範囲指定のフォーマットを作成するにはどのようにしたらよいでしょうか?

[回答]

制御データセットで、数値変数に対する範囲指定のフォーマットを作成する場合、まず次の変数を持ったSASデータセットを作成する必要があります。

DCOM 内容
FMTNAME フォーマットの名前
LABEL ラベル
TYPE 数値/文字値
START 範囲の開始値
END 範囲の終了値
SEXCL 開始値を除外する場合(<)は'Y'、含む場合(≦)は'N'
EEXCL 終了値を除外する場合(>)は'Y'、含む場合(≧)は'N'
HLO 最小値を範囲に含む場合には'L'、最大値を範囲に含む場合には'H'

範囲に上限値がない場合は変数ENDの値をブランク、下限値がない場合には変数STARTの値をブランクにします。たとえば、80以上を「A」、80未満-70以上「B」、70未満-60以上「C」、60未満を「D」とするようなフォーマット「RANK」を作成するための制御データセットは、次の内容になります。

  FMTNAME LABEL TYPE START END SEXCL EEXCL HLO

  RANK      D    N          60   N     Y    L
  RANK      C    N     60   70   N     Y
  RANK      B    N     70   80   N     Y
  RANK      A    N     80        N     N    H

制御データセットを作成し、フォーマットを作成するプログラム例は、次の通りです。

プログラム例

DATA rank; 
  INFILE cards DSD; 
  INPUT fmtname $ label $ type $ start $
        end $ sexcl $ eexcl $ hlo $; 
CARDS;
D,N,,60,N,Y,L
RANK,C,N,60,70,N,Y,
RANK,B,N,70,80,N,Y,
RANK,A,N,80,,N,N,H
;
RUN;

            /*制御データセットよりフォーマットを定義*/

PROC FORMAT CNTLIN=rank; 
RUN; 
                                            /* 確認 */
DATA a;
INPUT a;
CARDS;
59
60
69
70
79
80
81
;
RUN;
PROC PRINT;
RUN;

上記プログラムの実行結果は次のようになります。

OBS a

  1 D
  2 C
  3 C
  4 B
  5 B
  6 A
  7 A

次に示す、FORMATプロシジャを使ってフォーマットを作成するプログラムでも、同じ結果を得ることができます。

プログラム例

             /*FORMATプロシジャを使ったプログラム例*/
PROC FORMAT;
  VALUE rank LOW -< 60 = 'D'
              60 -< 70 = 'C'
              70 -< 80 = 'B'
              80 - HIGH = 'A';
RUN;