SORT プロシジャ

【SAS】SORTプロシジャの基本的な構文と使い方(昇順・降順ソート、重複削除)

構文

PROC SORT DATA = 入力データセット
	   OUT = 出力データセット
	   DUPOUT = 重複データセット
	   NODUPKEY (重複削除オプション)
	   ;
	BY BY変数(ソートキー);
        KEY KEY変数(ソートキー);
RUN;

※使用頻度の高いステートメントやオプションのみ記載

・DUPOUT=オプションはNODUPKEYを指定したときのみ指定できる
・BYステートメントとKEYステートメントは併用できない

 

サンプルデータ

サンプルとして、以下のデータを使用していきます。

data sample;

	infile datalines dlm="," dsd missover;
	input
		type		:8.
		type_name	:$200.
		type_label	:$200.
		rank		:8.
		maker		:$200.
		model		:$200.
		uriage		:8.
	;
	
datalines;
2,Light,軽自動車,9,ダイハツ,タフト,32191
1,Passenger,乗用車,2,トヨタ,ルーミー,77492
1,Passenger,乗用車,4,トヨタ,カローラ,53864
2,Light,軽自動車,8,ダイハツ,ミラ,36159
1,Passenger,乗用車,7,日産,ノート,46879
1,Passenger,乗用車,5,トヨタ,ハリアー,48271
1,Passenger,乗用車,6,トヨタ,ライズ,47965
2,Light,軽自動車,7,スズキ,アルト,36359
1,Passenger,乗用車,8,トヨタ,ヴォクシー,41101
2,Light,軽自動車,10,日産,デイズ,31558
1,Passenger,乗用車,9,ホンダ,フリード,35551
2,Light,軽自動車,6,スズキ,ハスラー,48221
2,Light,軽自動車,1,ホンダ,N-BOX,110551
2,Light,軽自動車,2,スズキ,スペーシア,78698
1,Passenger,乗用車,1,トヨタ,ヤリス,119112
2,Light,軽自動車,3,ダイハツ,タント,69262
2,Light,軽自動車,4,ダイハツ,ムーヴ,57761
2,Light,軽自動車,5,日産,ルークス,50055
1,Passenger,乗用車,3,トヨタ,アルファード,56778
1,Passenger,乗用車,10,トヨタ,シエンタ,33753
;
run;

使い方

SAS Studioで実行しているため、BaseSASと出力結果が異なる場合がございます。

昇順ソート

以下はシンプルな昇順ソートの例です。

proc sort data = sample
		  out = sample_ascending
		  ;
	by type rank;
run;

下図の通り、BYステートメントに指定した変数tyepとrankで昇順ソートされています。

ちなみに、上図はOUT=オプションで指定したsample_ascendingの中身になりますが、OUT=オプションを省略し、入力データセットsampleをそのまま上書きすることもできます。

しかし、業務で使用する場合は、基本的に、OUT=オプションの省略は非推奨と考えて良いかと思います。

理由としては、プログラムの規模が大きくなったり、他の人が引き継いだ時に、どの位置でデータセットが更新されたかわからなくなり、ミスが起きたり、デバッグ効率が下がるからです。

 

DESCENDINGオプションによる降順ソート

以下は、変数typeとrankの前にDESCENDINGオプションを追記して降順ソートする例です。

proc sort data = sample
		  out = sample_descending
		  ;
	by 
		descending type 
		descending rank
	;
run;

下図の通り、変数typeとrankで降順ソートされています。

 

KEYステートメントによる降順ソート

以下は、KEYステートメントで昇順ソートと降順ソートを組み合わせた例です。
BYステートメントと異なり、DESCENDINGオプションを変数ごとに記述する必要はなく、「/ DESCENDING」で一括にまとめることができます。

proc sort data = sample
		  out = sample_descending2
		  ;
	key maker;
	key type rank / descending;
	;
run;

下図の通り、変数makerで昇順ソート後、type、rankの順で降順ソートされています。

 

NODUPKEYによる重複削除

以下は、各メーカーごとに売上が一番高いレコードのみ抽出する例です。

/*メーカで昇順ソートし、売上で降順ソートする*/
proc sort data = sample
		  out = sample_uriage
		  ;
	by maker descending uriage;
run;

/*重複削除する*/
proc sort data = sample_uriage
		  out = sample_uriage_nodup
		  nodupkey
		  ;
	by maker;
run;

下図の通り、先に売上で降順ソートすることにより、次のPROC SORTのNODUPKEYで、各メーカーの最初に現れるレコードのみ残すことができています。

 

DUPOUT=オプションによる重複データの出力

以下はDUPOUT=オプションで重複データを生成する例です。

/*メーカで昇順ソートし、売上で降順ソートする*/
proc sort data = sample
		  out = sample_uriage
		  ;
	by maker descending uriage;
run;

/*重複削除する*/
proc sort data = sample_uriage
		  out = sample_uriage_nodup
		  dupout = sample_uriage_dup
		  nodupkey
		  ;
	by maker;
run;

下図の通り、各メーカーごとに売上が一番高いレコード以外が出力されています。