ラベル NOUNIQUEKEY の投稿を表示しています。 すべての投稿を表示
ラベル NOUNIQUEKEY の投稿を表示しています。 すべての投稿を表示

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関数の紹介も出来たことだし、とりあえずここまでとしたいと思います。




2014年3月6日木曜日

SORTプロシジャで重複レコードを削除・抽出する。



SORTプロシジャで重複レコードを削除・抽出するオプション「NODUPKEY」と「NOUNIQUEKEY」を紹介したいと思います。




サンプルデータ

data DT1;
input A B C$ @@;
cards;
1 1 a 1 2 a 2 1 c 2 1 b
;
 A 
 B  
 C  
  1     1     a  
  1    2  a 
  2    1  c   
  2    1  b   



例①

proc sort data=DT1 nodupkey out=DT2 dupout=DT3;
  by A B;
run;

DT2
 A 
 B  
 C  
  1     1     a  
  1    2  a 
  2    1  c 


DT3
 A 
 B  
 C  
  2     1  b   


解説

  • NODUPKEY」を指定すると、BY変数が重複してるレコードがあった場合に、最初のレコードのみ残して、以降の重複レコードを削除してくれる。
  • OUT=」のデータセットには削除後のレコードが入る。
  • DUPOUT=」のデータセットには削除したレコードが入る。
  • OUT=」を省略すると、「DATA=」のデータセットに上書きしてしまうので、注意!




例② (SAS9.3からの機能)

proc sort data=DT1 nouniquekey out=DT4 uniqueout=DT5;
  by A B;
run;

DT4
 A 
  B  
 C  
  2    1   c  
  2  1  b 


DT5
 A 
  B  
 C  
  1    1   a  
  1  2  a


解説

  • NOUNIQUEKEY」を指定すると、BY変数が重複してるレコードと、重複していないレコードを分割することが出来る。
  • OUT=」のデータセットには重複してるレコードが入る。
  • UNIQUEOUT=」のデータセットには重複してないレコードが入る。
  • OUT=」を省略すると、「DATA=」のデータセットに上書きしてしまうので、注意!



「NOUNIQUEKEY」 は結構助かる機能ですね。