例えば、与えられたデータセットに、顧客IDのようなものがあったとして、そのIDが別のマスタに既に登録済みか、そうでないかの真偽だけが欲しい場合もあると思います。
mergeステートメントならinデータセットオプションを使いますが、ハッシュならどうしましょうか?
別にfindメソッドで、dataも取得した上で、dataを何にも使わず無視して、dropしちゃえばいいんですが、dataに指定されている量が多いと無駄でしかなく、ハッシュの良さを殺しちゃいます。
単に、ある値と同じものがハッシュオブジェクトのkeにあるのかないのかが知りたい、或いはそれを条件分岐にしたい場合はcheckメソッドを使います。
data Q1;
X=1;Y='A';output;
X=2;Y='B';output;
X=1;Y='A';output;
X=2;Y='A';output;
X=3;Y='A';output;
run;
data A1;
length X 8. Y Z $2.;
if _N_=1 then do;
declare hash hq1();
hq1.definekey('X','Y');
hq1.definedata('Z');
hq1.definedone();
hq1.add(key:1,key:'A',data:'い');
hq1.add(key:2,key:'A',data:'ろ');
hq1.add(key:2,key:'B',data:'は');
call missing(Z);
end;
set Q1;
C1=ifc(hq1.check(),'該当なし','該当あり');
C2=ifc(hq1.check(key:3,key:'A'),'X=3,Y=Aは該当なし','X=3,Y=Aは該当あり');
keep X Y C1 C2;
run;
こんな感じです。C1の結果は、データセットQ1のX Yがハッシュにあるかどうかを見ていて、
C2は直接値を指定して検索するやり方のサンプルとしてだしました(全オブザベーション分同じことやってるので無駄ですが)
ちなみに今までは、一旦「rc=」とメソッドの戻り値を変数に割り当ててからifで分岐していましたが、
ダイレクトにifc関数やifn関数に入れれます。
0以外の値は真で 0なら偽となるSASの真偽ルールを利用しています。
脱線:
「ダイレクト向かい飛車」という戦法があって、言葉の響きがとても好きで、最近「ダイレクト」という言葉をやたら使いたがってます。
0 件のコメント:
コメントを投稿