推理将棋というのをご存知でしょうか?
ある将棋について、その将棋の局面にたいする会話文が提示され、その会話の内容から
どんな将棋であったか、例えばどういう手順で詰んだのかを推理するゲームです。
最近、新たにSASを覚えようとしているYさんにSASを教えていて、よく質問に来てくれるのですが
その時の私とYさんの会話の内容から、いったいYさんがどんな間違いをしたのかを推理してください。
Yさん
「すみません、IFで書くと通るんですけど、WHEREで書くとエラーになるんです。この間、その2つは同じように使うことができるって教えてくれましたよね?」
私
「確かにWHEREステートメントとサブセット化IFステートメントで、同じ結果を得ることはできるけど、少し機能が違うからね。もしかして、抽出元のデータセットにない変数に対して抽出をかけようとしてるんじゃない?それなら、IFは通っても、WHEREは通らないね」
Yさん
「違います。確かに抽出条件にしている変数は元のデータセットにあります。変数名も、使用する不等号も間違っていないのに、WHEREのときだけ、なんか演算子がどうとかってエラーになるんです」
さて、ほぼ実話ですが、この情報だけで、Yさんがどういった間違いを犯しているのか特定できますでしょうかというのが問題です。
答えが一つかどうか、ちょっと微妙ですが、まあYさんはそんなに複雑なことはそもそもできないので、単純なミスだと考えてください。
【解答】
Yさんは
data A;
X=1;
run;
のようなデータセットに対して
data A1;
set A;
if X='';
run;
というプログラムを書いていました。
変数の型を間違えて抽出式を書いています。
この場合、確かにIFなら一応通ります。
data A1;
set A;
where X='';
run;
しかしWHEREならエラーになります。
これはつまり、サブセット化IFはいったん全オブザベーションに対しての処理が行われるからですね、PDVにひっぱりこんで、不等式にかける際に、暗黙の型変換が適用され、文字型として抽出式にかけられます。
しかしWHEREはその前段階、PDVに落とし込んでくる以前に判定がかかるので、型変換が発生せず、式の演算子にたいする互換性エラーになります。
0 件のコメント:
コメントを投稿