ラベル 関数: NVALID の投稿を表示しています。 すべての投稿を表示
ラベル 関数: NVALID の投稿を表示しています。 すべての投稿を表示

2017年8月23日水曜日

【NVALID関数】指定した文字が変数名として有効か調べる


NVALID関数 を使うと、
指定した文字値が、SAS変数名として有効かどうかをチェックすることが出来ます。



構文


  NVALID( var , type )


① var   … 変数名として有効かチェックする文字値、またはチェックする文字値が格納された変数を指定。
② type … 変数名の規則タイプを指定。 "v7" を指定すると以下の規則(通常のSAS変数名の規則)でチェックが可能。

・先頭が半角の「英字」 または 「アンダースコア」
・後続の文字が半角の「英数字」または「アンダースコア」
・32文字以下

③変数名として有効であれば「1」、無効であれば「0」を返します。






サンプルデータ作成
data DT1;
input X & $10.;
cards;
myvar
my var
onevar
1var
;
run;
 X 
  myvar  
  my var
  onevar
  1var


変数 X に格納された値が変数名として有効かどうか判定
data DT2;
   set DT1;
   Y = nvalid( X , "v7" );
run;
 X 
   Y   
  myvar  
   1 
  my var
   0 
  onevar
   1
  1var
   0 




実践例

この関数は、マクロで使うと便利です。

%macro TEST( VAR= );

     %if "%sysfunc(nvalid(&VAR,v7))" = "0" %then %do;
          %put %str(E)RROR: マクロ変数 VAR の値が有効な変数名ではありません;
          %put %str(E)RROR: マクロ TEST を停止します;
          %return;
     %end;

     data DT1;
         &VAR = 1;
     run;

%mend;

%TEST( VAR=MY VAR );

ログ
ERROR: マクロ変数 VAR の値が有効な変数名ではありません
ERROR: マクロ TEST を停止します

上の例では、
マクロ「TEST」の引数「VAR」には有効なSAS変数名を指定しなきゃいけないようにし、無効なSAS変数名が指定されたら、ERRORをログに出して、マクロを停止しています。



後、別の実践例として以前書いた変数定義書のチェックにもNVALIDが使えます。
http://sas-boubi.blogspot.jp/2014/09/blog-post.html

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