ソート済のデータセット列について、その値をもつ「最初の行」や「最後の行」だけで処理を行う
- dataステップ内でbyステートメントを適用すると、byステートメントで指定した列ごとに「first.列名」および「last.列名」の列が生成される。
- それぞれ、下記の値が格納されている。
- first.列名 ... byステートメントでグループ化された各行のうち、最初の行にのみ'1'が格納されており、それ以外は'0'
- last.列名 ... byステートメントでグループ化された各行のうち、最後の行にのみ'1'が格納されており、それ以外は'0'
- この変数を使用すると、「最初だけ処理、最後だけ処理」といった処理を行わせることができる。
-
first.column_nameやlast.column_nameを使用し、if文で分岐させる。 - 使用したいデータセット列は、proc sortなどであらかじめソートしておく必要がある。
``` sas
proc sort data=sashelp.fish out=work.fish_sorted;
by species;
run;
data work.fish;
set work.fish_sorted(where=(not missing(Weight))); /* 欠損値の行を削除 */
by species; /* species列でグループ化 */
/* 計算用の列を初期化 */
if first.species then do;
count = 0;
weight_sum = 0;
end;
/* グループ内の行について、件数と合計を計算 */
retain count weight_sum;
count = count + 1;
weight_sum = weight_sum + Weight;
/* 平均値を計算し、行を出力 */
if last.species then do;
weight_avg = round(weight_sum / count, 0.1);
output;
end;
/* 出力したい列を指定 */
keep species count weight_sum weight_avg;
run;