proc sql

Proc sqlを極める(11) ーサブー

f:id:supermanJP:20200524152545p:plain

元のデータセットに要約統計量を結合する

あるデータセットの変数をグループごとに要約し、その結果を新規変数として元のデータセットに結合する操作は業務においてわりと頻出の操作かと思います。

例えばテストデータclassから性別ごとに体重、身長の平均を算出し、classに結合する場合はSASプロシジャでは以下のようなコードで実現できます。

Copy
proc means data=sashelp.class nway noprint; var height weight; class sex; output out=stat mean(height)=mean_height mean(weight)=mean_weight; run; proc sort data=sashelp.class out=_class; by sex name; run; data class; merge _class stat(keep=sex mean_height mean_weight); by sex; run;

要約統計量をmeansプロシジャで算出して、その結果を元のデータセットにマージします。SASの基本プロシジャのみを使用しているため、

ただしmergeステートメントを使用するには予めキー変数でソートする必要があるため若干面倒です。ソートはそこそこ計算負荷の重い処理です。
データ数がそこまで多くない場合は大きな影響はないかもしれませんが、

SQLの場合は以下のように書くことができます。書き方はいろいろありそうですが、proc sqlで動作するためには多分

Copy
proc sql noprint; create table class_sql as select a.*, b.mean_height, b.mean_weight from sashelp.class as a, (select sex, mean(height) as mean_height, mean(weight) as mean_weight from sashelp.class group by sex) as b where a.sex = b.sex order by a.sex,a.name; quit;