NOTE: 以下の箇所で◯◯を◯◯に変換しました。~SASログ入門 #2~

今回の注目ログメッセージは、

  • NOTE: 以下の箇所で数値を文字値に変換しました。
  • NOTE: 以下の箇所で文字値を数値に変換しました。

の、2つです。



「NOTE: 以下の箇所で数値を文字値に変換しました。」

data TEST ;
  length STR $5. ; /* 変数STRは文字です */
  STR = 1234 ;
  putlog STR= ;
run ;

上記のdataステップでは、変数STRをlengthステートメントで文字として定義しています。その文字変数STRに対して、数値1234 を格納しようとしています。

 60         data TEST ;
 61           length STR $5. ; /* 変数STRは文字です */
 62           STR = 1234 ;
 63           putlog STR= ;
 64         run ;
 
 NOTE: 以下の箇所で数値を文字値に変換しました。
       (行:カラム)
       62:9   
 STR=1234
 NOTE: データセットWORK.TESTは1オブザベーション、1変数です。
 NOTE: DATAステートメント処理(合計処理時間):
       処理時間           0.02 秒
       CPU時間            0.02 秒

文字変数に対して、数値は格納できないので、1234という数値は文字に変換されて、変数STRに格納されます。このとき、ログに、「NOTE: 以下の箇所で数値を文字値に変換しました。」が出力されます。このメッセージは、文字が入るべき箇所で数値が来ると出力されるログメッセージです。

代入式だけでなく関数の引数でも発生します。substr関数の第1引数は文字であるべきですが、下記のコードでは数値が記載されています。

 63         data _null_ ;
 64           STR = substr(123, 1, 1) ;
 65         run ;
 
 NOTE: 以下の箇所で数値を文字値に変換しました。
       (行:カラム)
       64:16   
 NOTE: DATAステートメント処理(合計処理時間):
       処理時間           0.00 秒
       CPU時間            0.01 秒

また、このメッセージは、代入式のときだけでなく、call symput を用いてマクロ変数を格納しようとしたときにも発生します。

 59         data _null_ ;
 60           call symput("TEST", 1234) ;
 61         run ;
 
 NOTE: 以下の箇所で数値を文字値に変換しました。
       (行:カラム)
       60:23   
 NOTE: DATAステートメント処理(合計処理時間):
       処理時間           0.01 秒
       CPU時間            0.01 秒

このメッセージを回避するには、put関数を用いて、自分で数値を文字に変換させる必要があります。call symput の場合は、call symputx を用いるのも回避方法の1つです。

 58         data TEST ;
 59           NUM = 1234 ;
 60           length STR $5. ; /* 変数STRは文字です */
 61           STR = put(NUM, 5.) ;
 62           putlog STR= ;
 63         run ;
 
 STR=1234
 NOTE: データセットWORK.TESTは1オブザベーション、2変数です。
 NOTE: DATAステートメント処理(合計処理時間):
       処理時間           0.02 秒
       CPU時間            0.02 秒
       
 64         
 65         data _null_ ;
 66           NUM = 1234 ;
 67           call symput("TEST1", put(NUM, 4.)) ;
 68         
 69           /* call symputx であれば、put関数で数値を文字に変換する必要はありません */
 70           call symputx("TEST2", NUM) ;
 71         run ;
 
 NOTE: DATAステートメント処理(合計処理時間):
       処理時間           0.01 秒
       CPU時間            0.01 秒
       
 72         %put &=TEST1. &=TEST2. ;
 TEST1=1234 TEST2=1234


「NOTE: 以下の箇所で文字値を数値に変換しました。」

逆パターンのログメッセージです。きちんと数値に変換されないことがあるので、逆パターンとはいえ、厄介なメッセージです。

data TEST ;
  NUM = 12345 ;   /* 変数NUMは数値です */
  NUM = "99999" ;
  putlog NUM= ;
run ;

上記のdataステップでは、変数NUMに12345を格納して数値として定義しています。そして、数値変数NUMに対して、文字"99999"を格納しようとしています。

 
 67         data TEST ;
 68           NUM = 12345 ;   /* 変数NUMは数値です */
 69           NUM = "99999" ;
 70           putlog NUM= ;
 71         run ;
 
 NOTE: 以下の箇所で文字値を数値に変換しました。
       (行:カラム)
       69:9   
 NUM=99999
 NOTE: データセットWORK.TESTは1オブザベーション、1変数です。
 NOTE: DATAステートメント処理(合計処理時間):
       処理時間           0.00 秒
       CPU時間            0.00 秒

数値変数に対して、文字は格納できないので、文字を数値に変換してから、文字変数に値が格納されます。このとき、ログに出力されるメッセージが、「NOTE: 以下の箇所で文字値を数値に変換しました。」です。

数値が入るべきところに文字が入ってきたため出力されるメッセージです。先のメッセージと同様に、関数内でも発生します。substr関数の第2, 3引数は数値であるべきですが、文字が記載されています。

 58         data _null_ ;
 59           STR = substr("ABC", "1", "1") ;
 60         run ;
 
 NOTE: 以下の箇所で文字値を数値に変換しました。
       (行:カラム)
       59:23   59:28   
 NOTE: DATAステートメント処理(合計処理時間):
       処理時間           0.00 秒
       CPU時間            0.02 秒

文字を数値に変換しようとするので、この文字の値が、数値に変換できるような値でないといけません。もし変換できないような値の場合、「NOTE: 無効な数値データ~」と言われて怒られてしまいます。このとき、数値変数には欠損値が格納されます。

 
 59         data TEST ;
 60           NUM = 12345 ; /* 変数NUMは数値です */
 61           NUM = "ABC" ;
 62           putlog NUM= ;
 63         run ;
 
 NOTE: 以下の箇所で文字値を数値に変換しました。
       (行:カラム)
       61:9   
 NOTE: 無効な数値データ'ABC'が行 61 カラム 9にあります。
 NUM=.
 NUM=. _ERROR_=1 _N_=1
 NOTE: データセットWORK.TESTは1オブザベーション、1変数です。
 NOTE: DATAステートメント処理(合計処理時間):
       処理時間           0.02 秒
       CPU時間            0.03 秒

「NOTE: 以下の箇所で文字値を数値に変換しました。」をログに出力させないようにするには、input関数を用いて、自分で文字を数値に変換させる必要があります。

 
 59         data TEST ;
 60           STR = "12345" ;
 61           NUM = 12345 ; /* 変数NUMは数値です */
 62           NUM = input(STR, best.) ;
 63         run ;
 
 NOTE: データセットWORK.TESTは1オブザベーション、2変数です。
 NOTE: DATAステートメント処理(合計処理時間):
       処理時間           0.01 秒
       CPU時間            0.01 秒

数値にならない文字を input関数で変換しようとすると、「NOTE: 関数INPUT (~)の引数は無効です。」と言われ怒られ、欠損値が格納されます。また、オブザベーションの内容がログに出力されてしまいます。

これを出なくするには、?, または ?? を input関数に入れるだけです。「日付フォーマットでない文字項目をSAS日付に変換するときにログ出力されるメッセージを抑制したい - SAS」という記事で、?, ?? について紹介してますので、ご参考ください。

 
 65         data TEST ;
 66           STR1 = "ABC" ;
 67           NUM = 12345 ; /* 変数NUMは数値です */
 68           NUM = input(STR1, best.) ;
 69         run ;
 
 NOTE: 関数INPUT (行 68 カラム 9)の引数は無効です。
 STR1=ABC NUM=. _ERROR_=1 _N_=1
 NOTE: 以下の箇所で演算式を計算できなかったため、結果を欠損値に設定しました。
       (回数)(行:カラム)
       1 68:9   
 NOTE: データセットWORK.TESTは1オブザベーション、2変数です。
 NOTE: DATAステートメント処理(合計処理時間):
       処理時間           0.02 秒
       CPU時間            0.02 秒
 70         
 71         data TEST ;
 72           STR2 = "ABC" ;
 73           NUM = 12345 ; /* 変数NUMは数値です */
 74           NUM = input(STR2, ? best.) ;
 75         run ;
 
 STR2=ABC NUM=. _ERROR_=1 _N_=1
 NOTE: データセットWORK.TESTは1オブザベーション、2変数です。
 NOTE: DATAステートメント処理(合計処理時間):
       処理時間           0.00 秒
       CPU時間            0.01 秒
 76         
 77         data TEST ;
 78           STR3 = "ABC" ;
 79           NUM = 12345 ; /* 変数NUMは数値です */
 80           NUM = input(STR3, ?? best.) ;
 81         run ;
 
 NOTE: データセットWORK.TESTは1オブザベーション、2変数です。
 NOTE: DATAステートメント処理(合計処理時間):
       処理時間           0.00 秒
       CPU時間            0.00 秒

input関数で変換する前に、文字が数値に変換できるかどうかをチェックしたい場合は、verify関数を用います。

 60         data TEST ;
 61           length STR $10. ;
 62           STR = "12345" ; output ;
 63           STR = " ABC" ;  output ;
 64         run ;
 
 NOTE: データセットWORK.TESTは2オブザベーション、1変数です。
 NOTE: DATAステートメント処理(合計処理時間):
       処理時間           0.01 秒
       CPU時間            0.02 秒
 65         
 66         data TEST2 ;
 67           set TEST ;
 68           if verify(trim(STR), '0123456789') = 0 then do ;
 69             NUM = input(STR, best.) ;
 70             output ;
 71           end ;
 72         run ;
 
 NOTE: データセットWORK.TESTから2オブザベーションを読み込みました。 
 NOTE: データセットWORK.TEST2は1オブザベーション、2変数です。
 NOTE: DATAステートメント処理(合計処理時間):
       処理時間           0.01 秒
       CPU時間            0.02 秒


参考サイト

  1. V9での新機能「CALL SYMPUTXルーチン」 | NIBLOG
  2. 値をマクロ変数に格納する「CALL SYMPUTX」その1 | SAS忘備録
  3. 値をマクロ変数に格納する「CALL SYMPUTX」その2 | SAS忘備録
  4. INPUT関数、PUT関数とは | SAS統計データ解析入門
  5. 文字値の検証 | SAS社 FAQ

コメント

このブログの人気の投稿

日付フォーマットでない文字項目をSAS日付に変換するときにログ出力されるメッセージを抑制したい - SAS

Linuxコマンド: date で◯か月前 / ◯か月後を取得するときの注意

データセット(.sas7bdatファイル)の文字コードを取得したい - SAS