ハッシュオブジェクトの世界⑦ コンペア革命 equalsメソッド

例えば、2つのデータセットが同一の内容であるかを比較し、同一である場合は1、ない場合は0などをマクロ変数にいれてそれを使用したい場合があると思います。

また、データステップ中に動的に値を動かしながら別のデータセットと同一内容になっているかをチェックして、それによってステップ中に処理の条件分岐をかけたい場合もあると思います。

SASのcompareプロシジャは多機能で、2つのデータセットにある差異を洗い出すことができます。またlengthやlabel、format等、定義情報の差も見れるので素晴らしいです。

ただし冒頭であげたように、単に値が同じか違うのかという2値で答えが欲しい場合や、データステップの途中で動的な値に対してコンペアしたい場合などには、あまり向きません。

プロシジャを回すだけで1ステップは必ず手数が掛かるので、そのアウトプットから0,1を導出する処理を書くと2ステップは掛かってしまいます。

またデータステップ中にコンペアは、多分、配列などを駆使すれば可能ですが複雑なデータステップになることは避けられないはずです。

そこでハッシュオブジェクトの出番です。

data Q1;
X=1;Y='A';output;
X=2;Y='B';output;
run;

data Q2;
X=1;Y='A';output;
X=2;Y='B';output;
run;

data A1;
length X 8. Y $2.;
 declare hash hq1(dataset:'Q1');
 hq1.defineKey('X');
 hq1.defineData('Y');
 hq1.defineDone();

 declare hash hq2(dataset:'Q2');
 hq2.defineKey('X');
 hq2.defineData('Y');
 hq2.defineDone();

 call missing(X,Y);


 hq1.equals(hash: 'hq2', result: FL);

 keep FL;

run;

結果は




です。

一致する場合は1、しない場合は0になるので、値を変えて試してみて下さい。

後はこれをcall symputとかでマクロに入れるもよし、このままデータステップのコードをどんどん書いていってもよしです。

ちなみにreplaceメソッドなどと合わせて使って、内容が一致するまでループで、値を変えていくみたいな使い方もみたことがあって、まさに動的なコンペアって感じで面白かった覚えがあります。



しかし、注意点があります。
①あまり大きなサイズのデータセットに使わないこと!
ハッシュオブジェクトは、ハードディスクではなくメモリに展開されるので、サイズがでかいと入らなかったり、処理効率が落ちます。どれくらいの大きさならいいのかというのは、実行するハードのメモリ容量と相談してくださいということです。

②値しかみない!どこが違うかもわからない!
フォーマットや長さ、ラベルの差は見れません。医薬品開発分野で、ダブルプログラミングした解析用データセットのコンペアなどに使うことはお勧めしません。




0 件のコメント:

コメントを投稿