data A;
X=1;output;
X=2;output;
X=3;output;
run;
data B;
Y="Y";Z=111;output;
Y="N";Z=222;output;
run;
の場合
data C;
set A;
if 0 then set B;
if X=1 then Y="Y";
else if X=2 then Y="N";
run;
のように書いた場合、Yという変数はset時のBには存在しない変数で、データステップ中で作成しているわけですが
となって、X=3の時もYがN”になっちゃってます。
これは前のオブザベーションで格納したYが消えずにretainされているからですね
なので、これが問題として、たまに顕在化するのは
data D;
set A;
if 0 then set B;
if _N_=1 then do;
declare hash h1(dataset:'B');
h1.definekey("Y");
h1.definedata("Z");
h1.definedone();
end;
if X=1 then Y="Y";
else if X=2 then Y="N";
if h1.find() ne 0 then call missing(Z);
run;
のように、合成した変数をキーにして、ハッシュ組む場合とかですね
if X=1 then Y="Y";
else if X=2 then Y="N";
を
if X=1 then Y="Y";
else if X=2 then Y="N";
else Y="";
としてやれば回避できますが、慣れてないとぱっとわかりにくいところですね