SORTプロシジャは,SASデータセットのオブザベーションの順番を並べかえるプロシジャです.
基本的には,並べ替えたいSASデータセット名と並べ替えるキーとしたい変数名を指定するだけですが,幾つかのオプション機能が用意されてます.
proc sort data=sashelp.class out=class;
by age sex;
run;
/*
OBS Name Sex Age Height Weight
1 Joyce F 11 51.3 50.5
2 Thomas M 11 57.5 85.0
3 Jane F 12 59.8 84.5
4 Louise F 12 56.3 77.0
5 James M 12 57.3 83.0
*/
構文
PROC SORT <オプション>;
BY 変数 ..;
WHERE 条件式;
RUN;
PROC SORTステートメント
PROC SORT <オプション>..
PROC SORTステートメントオプション
- DATA=SASデータセット名
- DATA=SASデータセット名(データセットオプション ..)
並べ替える元SASデータセット名を指定.デフォルトは,data=_last_ 最後に処理されたデータセットが対象となる.
- OUT=SASデータセット名
- OUT=SASデータセット名(データセットオプション ..)
並べ替えた後のSASデータセット名を指定.この指定がないと,元のSASデータセットに並べ替えたSASデータセットが上書きされる
- DATECOPY
SASデータセットの作成日と最新更新日を保持します.
- NODUPKEY
同じキー変数(複数あればすべて)の値が一致しているオブザベーションは,最初のオブザベーションを残して他を削除します.重複するキーを許さない処理です.
- NODUP
- NODUPRECS
並べ替えた結果,キー変数だけでなくすべての変数の値が,ひとつ前のオブザベーションと同一であれば,削除します.基本的には重複するデータを許さない処理です.ただし,ソートキー変数以外の順序は,一意ではないので,同じ値のオブザベーションでも隣に並ぶとはかぎらず,その場合は削除されませんのでご留意ください.
- DUPOUT=SASデータセット名
NODUPKEYまたは,NODUPRECSで重複削除されたオブザベーションを格納します.この指定がなければ,重複オブザベーションは,削除されたままです.
- EQUALS | NOEQUALS
同順位のオブザベーションの並びに関して,入力データでの順序を保持する(EQUAL)か,保持しなくていいか(NOEQUAL)を指定します.EQUALSがデフォルトですが,機械まかせのNOEQUALSのほうが,処理の負荷は小さくなります.
- REVERSE
ソート順を逆にします.文字コードオプション(ASCII,EBCDIC..)とは併用できません.
- ASCII | EBCDIC | DANISH | FINNISH | NORWEGIAN | SWEDISH | NATIONAL
ソート順となる文字コードは,Windows,UNIX,VMSは,ASCIIコード,メインフレームは,EBCDICコードがデフォルトになります.デフォルトではないソートを行いたい場合,その文字コードを指定します.また,REVERSEオプションとは併用できません.
ASCIIとEBCDICの典型的な違い
ACII 数字 < 英大文字 < 英小文字
EBCDIC 英小文字 < 英大文字 < 数字
- FORCE
INDEX付SASデータセットや,すでにソート済み情報が記録されてるSASデータセットは,ソートを指示しても,ソート済みとして,実行されませんが,強制的に実行したい場合に,FORCEオプションを指定します.
- OVERWRITE
入力SASデータセットを出力SASデータセットが出力し終わる前に削除することを許します.これは大きいファイルの処理には資源節約になりますが,処理に異常があった場合,元データまで失いますので,バックアップのない場合は行ってはいけません.
- SORTSIZE= MAX | n | nK | nM | nG
ソート時に使用するメモリサイズを指定します.MAXは,使用可能な最大値です.
メモリ不足でソート時間がかかっているような場合であれば,このサイズを大きくしてみるとよいです.デフォルトは,SORTSIZE=システムオプションの値です.
- TAGSORT
先にキー変数だけでソートする方法です.キー以外の変数が多い場合,ハードディスクに空きが少ない場合などに有効です.
- THREADS | NOTHREADS
マルチスレッドソートを有効,無効にします.デフォルトは,THREADSシステムオプション(NOTHREADSシステムオプション)です.
BYステートメント
BY 変数1 変数2 ..; BY 変数1 DESCENDING 変数2 ..; BY 変数1 DESCENDING 変数2 .. NOTSORTED;
BY変数の値で昇順ソートを指示する.列挙された順が第1ソートキー,第2ソートキーなどとソートキーの順になる.なお降順ソートしたい変数には,それぞれ変数の前にDESCENDINGをつけなければならない.
see also 汎用的なステートメント
WHEREステートメント
WHERE 条件式;
表示対象となるオブザベーションを条件式に合致するものだけに制限します.
see also 汎用的なステートメント
サンプル
住所変更履歴(addressHST)から,2007/1/1時点での住所コード(addreeCD)の一覧(address2007)を作成する.
まず,2007/1/1以前の変更履歴を顧客番号(customerID)毎に,更新日(date)で降順にソートする.次に,再度顧客番号毎に,先頭の更新日だけを残し,他を削除すれば,2007/1/1に対しもっとも最新の更新データだけが残ることになる.
data addressHST;
input date yymmdd8. customerID addressCD;
format date yymmdd10.;
cards;
20040725 288157 205
20050315 180757 385
20050703 524357 109
20060418 288157 215
20060612 524357 101
20071222 180757 201
20080806 180757 147
;
proc sort data=addressHST out=address2007;
by customerID descending date;
where date<"01jan2007"d;
run;
proc sort nodupkey data=address2007;
by customerID;
run;
/*
OBS date customerID addressCD
1 2005-03-15 180757 385
2 2006-04-18 288157 215
3 2006-06-12 524357 101
注)2番目のソートは,EQUALS指定がデフォルトであることを暗黙に利用している.
明示的でないことが気になるならば,以下のDATAステップで,明示的に最初の
オブザベーションを取り出す記述で同じ結果を得ることもできる.
data address2007;
set address2007;
by customerID;
if first.customerID;
run;
*/