次のデータステップで使用したい場合、常識的に考えれば当然2ステップが必要になります。
しかしdo untilループとファイル終端の際に1がたつend変数を利用することで、
複数のステップを繋いだ、かなり柔軟なデータステップを書くことができます。
今回は例として、単純なものを紹介します。
たとえば以下のように2つのデータセットがあったとします。
data Q1;
do X=1 to 5;
output;
end;
run;
data Q2;
do Y=1 to 10;
output;
end;
run;
そこでQ2の全オブザベーションを足して求められる値(1から10までの足し算なので55です)を
Q1の各オブザベーションにそれぞれ足したいとします。
その場合、普通はまずQ2の合計を、何らかのプロシージャやあるいはデータステップで導出し
Q1の全obsにマージしたり、或いはマクロ変数を介して足し算したりすることが浮かぶと思います。
(SQLならサブクエリで1発ですが今回はおいといてください)
ところが、なんと以下のように1ステップで書くことができます。
data A1;
do until(eofQ2);
set Q2 end=eofQ2;
Y_TOTAL+Y;
end;
do until(eofQ1);
set Q1 end=eofQ1;
TOTAL=X+Y_TOTAL;
output;
end;
run;
で結果は
となります。
do until(eofQ2)はdo until(eofQ2=1)の略で、set Q2の際にend=でeofQ2と変数をあてているので
Q2が全て読み込まれて処理されるまで、このループが続き、抜ける頃にはY_TOTALを含む最終obsのみが
残っています。
そこからQ1のループに入りますが、今回Q1をベースとして全obs残したいのでこちらにoutputをいれています。
このように書くことで、複数のデータステップを1つにまとめることができ、
前のステップで生成された値を、リレーのバトンタッチのように使用できます。
海外のコミュニティのやりとりなどで、何回も見たことがあるので、向こうでは定跡化されている
方法なのかもしれません。
あ、ちなみに多分今回の投稿で100回目です。
あと1万倍投稿すればデータステップ100万回になるので、がんばります。
もう多分10回目の投稿ぐらいから慢性的にネタ切れな感じなので、何か意見、要望、突っ込み、アイデア、質問、なんでもください、まっています。




