SASプログラマ歴が長いと、みんなこれ経験してるんじゃなかろうか。
😕失敗例1: 「_N_」と組み合わせて失敗しがち
変数Xに1~連番を入れたいのに、なんかおかしい。
解説
- まずデータステップは内部の動きとして、
- 次に「_N_」は内部の動きとして、
_N_=1 のオブザベーションがたまたまサブセット化IFによって「処理継続・出力」の対象外になっているので、「IF _N_=1 THEN DO; ~END;」の中の処理も動いていません。
上の例ではエラーが出て分かりやすいですが、書き方によってはエラーが出ない場合もあって失敗に気づかない可能性もあるので要注意です。
😕失敗例2: 「END=オプション」と組み合わせて失敗しがち
data dt3; set sashelp.class end=_eof; if age=12; if _eof then y=1; keep age y; run; |
フラグ立ってないじゃないか!
これは「END=オプション」の挙動を勘違いしていると起こりやすいです。
「END=オプション」はSET文・WHERE文で読み込まれる最後のオブザベーションに作用しますが、その最後のオブザベーションがサブセット化IFによって「処理継続・出力」の対象外になっているためです。
あと思いつくのが、以下で紹介している「FIRST.BY変数」「LAST.BY変数」も、サブセット化IFと組み合わせると、同様の原理で意図しない結果になりやすいですね。
「FIRST.BY変数」と「LAST.BY変数」で、グループ毎の最初と最後のオブザベーションを特定する。













