ハッシュオブジェクトの世界③ checkメソッドと、メソッドの戻り値をそのままIFC IFN関数に使う話

今まではfindメソッドで、ハッシュオブジェクトからdataで指定した変数の値をとってきていましたが、必ずしも値が欲しくない場合はあります。

例えば、与えられたデータセットに、顧客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 件のコメント:

コメントを投稿