どなたか、わかる方がいらっしゃればお力を貸してください。
今、以下のようなデータセットがあったとします。
data Q1;
X=1;Y=2;Z=3;output;
X=2;Y=3;Z=4;output;
X=1;Y=1;Z=3;output;
run;
それに対してSASを勉強中のYさんが
「X=1であるデータのうち、Y=2のデータのみを抽出したくて、こう書いたのですが
うまくいきませんでした。何が間違ってますか?」
と言ってきて、コードを見てみると
data E1;
set Q1;
if X=1 then if Y=2;
run;
でした。
僕はいいました
「なんだこの変な書き方。その条件なら、日本語の文章に惑わされず
andで結ぶだけじゃない?」
data A1;
set Q1;
if X=1 and Y=2;
run;
まあ、Yさん的には目的の処理が書けてこれでOKなのですが、
問題は
data E1;
set Q1;
if X=1 then if Y=2;
run;
がエラーもワーニングなく実行できるということです。
僕はてっきりエラーになると思っていました。
エラーにならないのなら、andで結んだのとおんなじ結果かな?と思いました。
if X=1 の場合にサブセット化IFでY=2がかかるのかと、、。
ところが結果は以下のようになりました。
なにこれ?どういう処理がされたらこんな結果になんの??
X=1で絞れているわけではないし、Y=2でも絞れてないし、なんで2obs?
しかも2レコード目はなんで出てきた??
しばらく考えたのですがわかりませんでした。
ちなみにどうしてもandを使わず、if 今回の処理をするならどう書くかを考えると
data A2;
set Q1;
if X=1 then if Y=2 then output;
run;
が思い浮かんだので実行すると、これは正しい結果を導きました。
じゃあ、以下のコードも通るよねと考えました
data E2;
set Q1;
if X=1 then if Y^=2 then delete;
run;
しかし、また変な結果です。
なんで??
絶対、if X=1 then if Y=2;なんて第一感悪手で実戦では本能的に書かないからいいんですけど
、どうしてもひっかかる、気になります!気になるんです
if then ステートメントの後に、if 条件式だけを書いたり、
if then deleteを書くと、変な結果になるのはなぜなんでしょうか??
どなたか、推論でもいいので教えてください。
=======================
追記
=======================
解決しました!的確で素晴らしいコメントをいただきました!
詳細はコメント欄をみてください。
また一つ賢くなれた気がします。
ちなみにコメントくださったのはブログ「SAS忘備録(URL http://sas-boubi.blogspot.jp/)」
の作者様です。
SAS忘備録は、本当に素晴らしくて、僕のと違って文章が読みやすいし押しつけがましくないし
丁寧ですし、書かれていることも洗練された役にたつ知識ばかりで、見習いたいです。





