2014年9月2日火曜日

変数定義書を自動でチェックするプログラムを作ってみる。


SASデータセットの変数定義書を、以下のような感じでExcelで作ってたとする。



今回、SASを使ってこの変数定義におかしなところがないかチェックしてみたいと思います。

準備: まずEXCELのDB定義書を読み込む

読み込むプログラムは割愛。
(Excelを読み込む方法はなんでも良いのですが、文字切れやデータの欠落などが起きやすく、確実に読み込める方法がないので要注意)

仮にExcelファイルを読み込んで、以下SASデータセットDEFINEを作成したとします。

データセットDEFINE
F1 
F2 
F3
F4
F5
F6
F7 
 1
 DEMO    
 PATNO    
 被験者No    
 C    
 10    
     
 2
 DEMO    
 1BIRTH    
 生年月日    
 N    
 8    
 YYMMDDS10 
 3
 DEMO    
 AGE    
 年齢 
 N    
 8    
     
 4
 DEMO    
 AGE    
 発症年月日    
 N    
 8    
 YYMMDDS10 
 5
 AE    
 PATNO    
 被験者No    
 C    
 10    
     
 6
 AE    
 AENO    
 有害事象No    
 N   
 8   
     
 7
 AE   
 AETERM  
 有害事象名   
 C    
 20    


*** チェック①:変数名がおかしい ;
data CHECK1;
   set DEFINE;
   CHECK = NVALID(F3, "V7");
   if CHECK=0 then  put "WARNING: 変数名がおかしいです No." F1 F2 F3 ;
run;

ログ
WARNING: 変数名がおかしいです No.2 DEMO 1BIRTH
WARNING: 変数名がおかしいです No.7 AE AETERM


*** チェック②:データセット内で変数名が重複してる(SAS9.3以上でのみ動作) ;
proc sort data=DEFINE out=CHECK2 nouniquekey;
   by F2 F3;
run;

data _NULL_ ;
   set CHECK2;
   put "WARNING: 変数名が重複しています No." F1 F2 F3;
run;

ログ
WARNING: 変数名が重複しています No.3 DEMO AGE
WARNING: 変数名が重複しています No.4 DEMO AGE


解説

チェック①
NVALID関数は、指定した文字がSAS変数名として有効かどうか検証をしてくれる関数です (こちら参照)

今回の結果で最初のWARNINGは変数名が「1BIRTH」となってて、変数名の先頭は数値を入れちゃダメというルールを破ってます。
2つ目のWARNINGは変数名が「ETERM」で、よく見ると先頭が全角の「A」です。
変数名に全角はダメというルールだけど、たまにやっちゃうミスなんですよね。


チェック②
SORTプロシジャのNOUNIQUEKEYはSAS9.3から追加された機能で、BY値が重複しているレコードを抽出してくれる (こちらを参照)



もっと細かくチェックするプログラムを組むことが出来るかと思いますが、、
長くなりそうなので今回はNVALID関数の紹介も出来たことだし、とりあえずここまでとしたいと思います。




0 件のコメント:

コメントを投稿