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
*/