RANKプロシジャ

Last-modified: 2008-07-27 (日) 18:16:12

Base SASに含まれるRANKプロシジャは、名前の通り順位・ランクを計算するために
使用できます。
デフォルトでは、変数値の小さな方から大きな方へ順位が1, 2, 3,... と与えられ、また
同じ値が複数存在するときには平均順位が計算されます。
なお、欠損値に対しては順位は計算されません。また、OUT=を省略した場合、
DATA1, DATA2,... という名前でデータセットが作成されます。

data test; /*サンプルデータ*/
  input a b;
datalines;
1 1
4 2
1 5
2 .
3 6
2 4
;
run;

proc rank data=test out=rankout1;
  var a b;
run;

proc print data=rankout1;
run;

/*
OBS     a     b

 1     1.5    1
 2     6.0    2
 3     1.5    4
 4     3.5    .
 5     5.0    5
 6     3.5    3
*/

順位を逆にして与える、つまり大きな方から小さな方へ順位を1, 2, 3,...と与えるには
DESCENDINGオプションをPROC RANKステートメントで指定します。

proc rank data=test descending out=rankout2;
  var a b;
run;

proc print data=rankout2;
run;

/*
OBS     a     b

 1     5.5    5
 2     1.0    4
 3     5.5    2
 4     3.5    .
 5     2.0    1
 6     3.5    3
*/

もしオリジナルの変数値を変えたくなく、順位を新たに変数を作って格納したい場合には、
RANKSステートメントを利用しましょう。
VARステートメントで列挙した変数に対応させて、新規変数名を指定します。VARステートメントを
省略したときや、VARステートメントとRANKSステートメントにおける変数の数が一致しない
場合には、エラーが発生してしまうことに注意してください。

proc rank data=test descending out=rankout3;
  var a b;
  ranks ranka rankb;
run;

proc print data=rankout3;
run;

/*
OBS    a    b    ranka    rankb

 1     1    1     5.5       5
 2     4    2     1.0       4
 3     1    5     5.5       2
 4     2    .     3.5       .
 5     3    6     2.0       1
 6     2    4     3.5       3
*/

RANKプロシジャには、変数値に基づいてグループ分けを行う便利な機能もあります。具体的には、GROUPS=オプションをPROC RANKステートメントで利用します。グループ数を表す数値を指定してください。このとき、0から
n-1までの値が割り振られます(nは指定した数値)。RANKプロシジャは各グループになるべく同じ数のオブザベーションが含まれるように割り振りますが、タイデータ(同順位のデータ)が多い場合には、意図とは大きく異なるような結果になるかもしれません。

proc rank data=test descending groups=3 out=rankout4;
  var a b;
  ranks ranka rankb;
run;

proc print data=rankout4;
run;

/*
OBS    a    b    ranka    rankb

 1     1    1      2        2
 2     4    2      0        2
 3     1    5      2        1
 4     2    .      1        .
 5     3    6      0        0
 6     2    4      1        1
*/