_N_自動変数

今回は自動変数_N_について紹介します。

自動変数とは

 自動変数とはSASデータセットを読み込んだ際に自動で作成される変数です。

データセットには出力されずSETステートメントで指定したデータセットの読み込み終了後には自動で削除されます。

初期値は1でdata ステートメントを通る度に1ずつ増分します。 

 

イメージとしては以下の図のようになります。

f:id:essbase:20201104151737p:plain

_N_イメージ

上記のイメージから分かる通りDATAステートメントを通る度に_N_のカウンタが増分するため、ある種ステートメントがDOループの働きをしています。

 

DATAステップでのDOループ

DATAステップがDOループの働きをしているということは同ステップ内でDOループを使用した場合、通常のプログラミング言語と同じように_N_変数はouter loop、DOループ内で使用しているカウンタ変数はinner loopの動きをするということになります。

 

f:id:essbase:20201104154916p:plain

DATAステップでのDOループ

上の図では_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_がループしていないためです。

 

次回はこの特徴を使用したループの使用方法を解説します。