Nオブザベーション置きにデータを抜き取って新しいデータセットをつくる_SETとdoループで

今回もコメントでいただいた内容からです。

今、以下のような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を包むと
○○おきにデータを抽出することと同義になるのですね。

奥が深いですね。




0 件のコメント:

コメントを投稿