ラベル プロシジャ: COMPARE の投稿を表示しています。 すべての投稿を表示
ラベル プロシジャ: COMPARE の投稿を表示しています。 すべての投稿を表示

2019年7月16日火曜日

【PROC COMPARE入門】データセット間の変数値の比較





データセット間の変数値を比較する「PROC COMPARE」をご紹介。




構文 1

PROC COMPARE  BASE=データセット1  COMPARE=データセット2 ;
RUN ;

  • 「データセット1」と「データセット2」を比較します。
  • 上から順に同じ位置にあるオブザベーション同士を比較します。
  • 同じ変数名同士を比較します。


イメージ(黄色部分が比較対象)






構文 2

PROC COMPARE  BASE=データセット1  COMPARE=データセット2 ;
      ID   ID変数1   ID変数2 … ;
RUN ;


  • 「データセット1」と「データセット2」を比較します。
  • ID変数の値が共通するオブザベーション同士を比較します。
  • 同じ変数名同士を比較します。


変数XをIDとしたときのイメージ(黄色部分が比較対象)






例

* sample data ;
data dt1;
input x y$ z;
cards;
1 aa 10
2 bb 20
4 cc 30
;

data dt2;
input x y$ z;
cards;
1 aa 10
2 bb 20
3 cc 30
4 dd 40
;

* proc compare ; 
proc compare base=dt1 compare=dt2;
    id x;
run;




出力結果

1. 「データセットの要約レポート」


各データセットの「変数の数」「OBSの数」「共通変数の数」「ID変数の数」などが表示されます。



2. 「オブザベーションの要約レポート」「値の比較の要約レポート」


「共通するOBSの数」「共通しないOBSの数」「比較変数のいずれかが等しくないOBSの数」「すべての比較変数が同等なOBSの数」などなどが表示されます。



3. 変数値の比較結果


実際の不一致箇所が表示されます。



出力結果の確認の流れ(最低限)

  • 「データセットの要約レポート」で、狙い通りのOBS/変数が比較対象になってるか確認。
  • 「オブザベーションの要約レポート」で不一致となったOBSがあるか確認
  • 不一致のOBSがある場合は「変数値の比較結果」から実際の不一致箇所を確認



2015年7月6日月曜日

COMPAREプロシジャでデータセット間に不一致があった事をログに表示するオプション




COMPAREプロシジャの基本については以下をご覧ください。
【PROC COMPARE入門】データセット間の変数値の比較



さて、以下のような2つのデータセットがあったとします。

data DT1;
   length A $2.;
   A="aa";
run;

 A  
 aa 

data DT2;
   length A B $3.;
   A="aaa"; B="bbb"; output;
   A="ccc"; B="ddd"; output;
run;

 A  
 B  
 aaa 
 bbb 
 ccc 
 ddd 



この2つのデータセットをCOMPAREプロシジャで比較してみます。

proc compare base=DT1 compare=DT2 ;
run;

出力結果(一部)




この出力結果は見るところが多いので、たまに不一致箇所を見落としてしまう事があります。
そこで、WARNINGオプションをつけると、不一致があった旨のWARNINGメッセージをログに表示してくれます。

proc compare base=DT1 compare=DT2  warning ;
run;

ログ
WARNING: データセット WORK.DT2 にある 1 変数が WORK.DT1 にはありません。
WARNING: 1 変数の属性が 2 つのデータセットで一致しません。
WARNING: データセット WORK.DT2 にある 1 オブザベーションが WORK.DT1 にはありません。
WARNING: 次の 1 変数の値は不等です : A
WARNING: データセット WORK.DT1 と WORK.DT2 には不等な値があります。


WARN と略してもいけます。
また、ERROR と書けばERRORメッセージになります。


これで、不一致の見落としを軽減できそうです。


2014年12月1日月曜日

変数名などの定義情報を比較する方法



以下に、似てるようで似てない2つのデータセットがあります。

data DT1;
  length A $20. B C 8.;
  A="xxx";
  B=1;
  C=2;
run;

 A  
  B   
  C  
 xxx 
  1
  2

data DT2;
  length A C $10. D 8.;
  A="yyy";
  C="zzz";
  D=3;
run;

  A  
  C   
  D   
 yyy
 zzz
  3



この2つの変数定義を比較したい場合、以下の例のようにCOMPAREプロシジャを使うと楽です。

注意:
COMPAREプロシジャには変数の順番を比較する機能はないようです (例えば片方のデータセットでは変数A, B, C の順、もう片方では変数A, C, B の順で定義されてても、定義不一致として検出してくれません)


proc compare  base=DT1(obs=0)  compare=DT2(obs=0) listvar;
run ;


結果の一部




解説


  • listvar を指定すると、一方にしかない変数名をリストアップしてくれます。
  • それと、今回比較するのは変数定義だけで、変数値の比較結果は必要ありません。なので、(obs=0) をつけてオブザベーションを読み込まないようにします。
  • ログに「同等なオブザベーションが見つかりません。」みたいなWARNINGが出てしまうけど、オブザベーションを読み込んでないから出るメッセージです。



もし厳密にWARNINGを出したくない場合は、以下のようにかけばok

proc compare  base=DT1  compare=DT2  listvar  novalues ;
run ;



novaluesで変数値の比較結果を出力しないようにします。
(といっても裏では変数値の比較をしてるので、重たいデータセットだと実行がモタつくかも)