以下のプログラムを実行して、各データセットを作成します。
data sample1;
do a = 1 to 10;
output;
end;
run;
data sample2;
b=.;
run;
data sample3;
set sample1 - sample2;
run;
すると、以下のようなデータセットが作成されます。
sample1 | sample2 | sample3 |
![]() |
![]() |
![]() |
ここまでは問題ないでしょう。
次に、以下のように条件を追記し、変数に値を代入してみます。
data sample4;
set sample1 - sample2;
if _n_=5 then do;
a=99;
b=99;
end;
run;
すると、変数bについて、5オブザベーション目(_n_=5)のみならず、それ以外のレコードにも99が格納されています。
これは、データステップ開始時に設けられるプログラムデータベクトル(PDV)の値について、sample1を読み込んでいるときは変数aの値のみが更新され、sample1に存在しない変数bはそのまま保持され続けるからです。(表現が難しい・・・)
sample1の読込みは、sample2の変数bの値(PDV)に影響を及ぼさない、と言った方が分かりやすいかもしれません。
未だに、このRETAINの仕様を忘れてしまい、ミスしてしまうことがあるので注意が必要です。