今、以下のような20オブザベーションのデータセットがあるとします。
data Q1;
do X=1 to 20;
output;
end;
run;
ここから3obsごとに順番にオブザベーションを抽出したい場合、どうしますか?
data A0;
set Q1;
if mod(_N_,3)^=0 then delete;
run;
でも詰みですが、以下のコードを見てください。
data A1;
do i=1 to 3;
set Q1;
end;
run;
え?なにこれな感じですが、これを実行すると結果が
となってiをdropすると、まさに3obsおきに抽出できていることになります。
data A2;
do i=1 to 4;
set Q1;
end;
run;
to の後を4にするとどうなるか
4つおきに抽出できます。
なんのこっちゃらいです。
なぜ上記のようなコードで、このような結果になるかを考えます。
3obsおきの例で考えます。
さて
data A3;
do i=1 to 3;
set Q1;
output;
end;
run;
として、ループの中に明示的なoutputをいれてみます。
すると結果は
20obsが出力されます。「i」に注目すると1-3を繰り返しています。
さて、次に
data A4;
do i=1 to 3;
set Q1;
output;
end;
output;
run;
としてループの外にoutputをおいてみます。
すると
26オブザベーションの結果が返ってきます。
iの値に注目してください「4」がでてきていますね。
i=4で抽出するとどうなりますか?
となって最初に作った結果と同じですね。
もう、だいたい見えてきましたね。
つまりループの中ではoutputがおきないので、そこで値を上書いて
抽出間隔+1でループを抜けた後(値は最後のが保持)に暗黙のOUTPUTを利用して
出力しているために、結果としてi=○○のdo ループでSETを包むと
○○おきにデータを抽出することと同義になるのですね。
奥が深いですね。