横方向(列方向)にcall sortn,call sortcルーチンを使ってソート処理をかける

SASで並び替えというと、縦方向(行方向)、つまりオブザベーションの値を以て並び替える処理が通常で、あまり横にソートするということは多くないと思われます。
ARRAYで

たとえば以下のようなデータセット

data Q1;
 X=3;Y=2;Z=1;output;
 X=-1;Y=.;Z=10;output;
 X=1;Y=3;Z=2;output;
run;


があったとして
3つの変数の値の大小を比較して一番小さい値をX、2番目をY、、というように
値を並び替えたいとします。
つまり、欲しい結果は以下のようになります。


この場合


data A1;
 set Q1;
 call sortn(of X--Z);
run;

で詰みです。
CALL SORTNルーチンは数値変数を指定することで、値によって
変数の中身をソートしてくれます。


また次のデータセットのように値が文字型の場合はどうでしょうか

data Q2;
length X Y Z $2.;
 X='B';Y='A';Z='C';output;
 X='さ';Y='か';Z='あ';output;
 X='';Y='D';Z='-';output;
run;


この場合はCALL SORTCルーチンを利用して以下のように書けます。

data A2;
 set Q2;
 call sortc(of X--Z);
run;

すると実行結果は


となります。


これを知らないと、ARRAYを使ってループで大小比較したり、
TRANSPOSEしてSORTしてTRANSPOSEして戻すみたいな少し面倒な処理をやってしまいがちです。





0 件のコメント:

コメントを投稿