SETステートメントの落とし穴「値の保持」の続きです。
サンプルデータ
data DT1; A="003"; B=1; C=.; output; run; data DT2; A="001"; B=1; output; A="001"; B=.; output; A="002"; B=.; output; A="003"; B=.; output; ; run; proc sort data=DT1; by A; run; proc sort data=DT2; by A; run;
|
問題
サンプルデータより以下のプログラムを実行すると、①②どちらのデータが出来るでしょうか?
data DT3; set DT1 DT2; by A; if B=1 then C=111; run;
|
正解は①です!
ポイントは「BY値が変わると、PDV内の変数値が初期化される」という事です。
①の3行目はBY変数Aが「001」から「002」に変わってます。そのためPDV内の変数値が初期化され変数CがNULLになったというわけです。
①の3行目はBY変数Aが「001」から「002」に変わってます。そのためPDV内の変数値が初期化され変数CがNULLになったというわけです。
4行目と5行目のBY値はともに「003」ですが、4行目で読み込んでるデータセットはDT1で、5行目はDT2から読み込んでいます。
これは前回説明しましたが、読み込むデータセットが変わった場合もPDV内の変数値が初期化されるので、5行目のCはNULLになります。
一言でまとめると。。「別のデータセットか別のBY値になったら初期化される」という事です。
2回に分けて落とし穴というタイトルでまとめましたが、
実はこの性質を理解すれば、色々面白いことが出来ちゃうので、また別の機会に紹介したいと思います。
0 件のコメント:
コメントを投稿