大阪に帰省していた際、商店街の個人商店みたいなところで買い物をしたんですが、
100円と値札が貼ってあったので、108円を渡すと、店主のおっちゃんが
「100円でええよ!おっちゃんには100円も108円も92円も一緒やわ!」と言って100円だけ受け取りました。
つまり、おっちゃんの中では8%の違いは無いと同じということです。おっちゃんがコンペアプロシジャなら2つの値は一致です。
この気前の良さを実際にCompareプロシジャに憑依させてやろうというのが今回の記事です。
data Q1;
X='A';Y=100;output;
X='B';Y=100;output;
X='C';Y=100;output;
run;
data Q2;
X='A';Y=108;output;
X='B';Y=92;output;
X='C';Y=109;output;
run;
あ、ちなみに今回からSAS University Edition(例の無料のやつ)を使用しています。
(しかしまだ使い勝手が慣れない。。。)
で、
proc compare data=Q1 comp=Q2 method=percent criterion=8;
id X;
run;
とすると、
結果は
の1件だけが差異として表示されます。
あとの2件については、%差が8%以内なので許容されました。
ちなみに
の部分を見ると、不等な値の数は1つですが、完全に同等ではない数が3になっているのが
わかります。
つまり2個が、完全一致ではないけど、許容された一致というわけです。
method=percentで%差で比較することを指定し、criterion=で許容する%差を指定します。
method=は他にも、ABSOLUTEやRELATIVEなどがあります。普段使っているデフォルトはexactです。
http://support.sas.com/documentation/cdl/en/proc/61895/HTML/default/viewer.htm#a000146742.htm
バリデーションとしてコンペアする場合は、大体一致なんでOK!!なんてことは、許されないことが多いですが、まあ、知っていて損はないはずです。
同じデータセット内の変数同士の差異を検出する。compare関数とproc compareのwithステートメント
例えば
data Q1;
length X Y Z $10.;
X='ABC';Y='ACC';Z='ABC';output;
X='BBC';Y='BBC';Z='BBC';output;
X='CBC';Y='CBC';Z='CBB';output;
run;
Xの値とYの値、Xの値とZの値、Yの値とZの値を比較して同一かどうかを検証
したいとします。
方法はたくさんありますが、たとえば、compare関数を使えば
data A1;
set Q1;
XvsY=compare(X,Y);
XvsZ=compare(X,Z);
YvsZ=compare(Y,Z);
run;
のようになり、0であれば同一、数字は最初に差異が発見された位置を示しています
data A2;
set Q1;
YvsX=compare(Y,X);
ZvsX=compare(Z,X);
ZvsY=compare(Z,Y);
run;
のように指定をひっくり返すと
基準が逆転するので正負も逆転します。
で、こういうことをcompareプロシジャでやってみたい場合は
proc compare data=Q1;
var X X Y;
with Y Z Z;
run;
のようにvarとwithの指定順を同期させることで可能です。縦に見ると、何と何を比較しているか
わかりやすいです。
結果の抜粋は以下です。
ODSへの対応や、差異のデータセットへの吐き出しについてcompareプロシジャには
まだ改良の余地があると思うので、次期バージョンでもいいからてこ入れして欲しいなと思います。
data Q1;
length X Y Z $10.;
X='ABC';Y='ACC';Z='ABC';output;
X='BBC';Y='BBC';Z='BBC';output;
X='CBC';Y='CBC';Z='CBB';output;
run;
Xの値とYの値、Xの値とZの値、Yの値とZの値を比較して同一かどうかを検証
したいとします。
方法はたくさんありますが、たとえば、compare関数を使えば
data A1;
set Q1;
XvsY=compare(X,Y);
XvsZ=compare(X,Z);
YvsZ=compare(Y,Z);
run;
のようになり、0であれば同一、数字は最初に差異が発見された位置を示しています
data A2;
set Q1;
YvsX=compare(Y,X);
ZvsX=compare(Z,X);
ZvsY=compare(Z,Y);
run;
のように指定をひっくり返すと
基準が逆転するので正負も逆転します。
で、こういうことをcompareプロシジャでやってみたい場合は
proc compare data=Q1;
var X X Y;
with Y Z Z;
run;
のようにvarとwithの指定順を同期させることで可能です。縦に見ると、何と何を比較しているか
わかりやすいです。
結果の抜粋は以下です。
ODSへの対応や、差異のデータセットへの吐き出しについてcompareプロシジャには
まだ改良の余地があると思うので、次期バージョンでもいいからてこ入れして欲しいなと思います。
登録:
コメント (Atom)







