_N_自動変数
今回は自動変数_N_について紹介します。
自動変数とは
自動変数とはSASデータセットを読み込んだ際に自動で作成される変数です。
データセットには出力されずSETステートメントで指定したデータセットの読み込み終了後には自動で削除されます。
初期値は1でdata ステートメントを通る度に1ずつ増分します。
イメージとしては以下の図のようになります。
上記のイメージから分かる通りDATAステートメントを通る度に_N_のカウンタが増分するため、ある種ステートメントがDOループの働きをしています。
DATAステップでのDOループ
DATAステップがDOループの働きをしているということは同ステップ内でDOループを使用した場合、通常のプログラミング言語と同じように_N_変数はouter loop、DOループ内で使用しているカウンタ変数はinner loopの動きをするということになります。
上の図では_N_がouter loop、ridがinner loopになります。setステートメントで使用しているcurobsオプションは読み込んだデータセットのオブザベーションのカウンタを保存します。オプションで指定しているrid変数がinner loopになります。
_N_は読み込んだデータセット数分しか増分しません。上の例は1です。
ridはinner loopになりますのでオブザベーション数分増分します。上記の例では疑似的に10オブザベーションにしています。下のsashelp.classを使用した例でみるとわかりやすいかと思います。
例:
data work.aaa;
do until(eof);
set sashelp.class curobs=rid end=eof;
put _all_;
end;
run;
結果
_N_=1 rid=1
_N_=1 rid=2
_N_=1 rid=3
_N_=1 rid=4
_N_=1 rid=5
_N_=1 rid=6
_N_=1 rid=7
_N_=1 rid=8
_N_=1 rid=9
_N_=1 rid=10
_N_=1 rid=11
_N_=1 rid=12
_N_=1 rid=13
_N_=1 rid=14
_N_=1 rid=15
_N_=1 rid=16
_N_=1 rid=17
_N_=1 rid=18
_N_=1 rid=19
PUTの結果のみ表示しておりますが、データセットとしては1件しか表示されません。なぜか?_N_がループしていないためです。
次回はこの特徴を使用したループの使用方法を解説します。