投稿

7月, 2015の投稿を表示しています

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

文字項目の長さが決定するタイミング - SAS

イメージ
lengthステートメントを使用しない場合、文字の長さが決定するタイミングは、dataステップの中で該当変数が初めて登場してくるところです。 data TEST ; A = "12345" ; output ; A = "01234567890" ; output ; run ; proc contents data=TEST ; run ; 上記のプログラムでは、変数 A に最初の式で5バイトの文字列を格納し、次の式で10バイトの文字列を格納しようとしています。文字の長さは、最初の式で決定するので、変数 A の長さは5バイトです。なので、次の式で10バイトの文字列をすべて格納することはできません。 初めて登場するタイミングで決定すると言いましたが、この「初めて」というのは実行されない式にも当てはまります。 data TEST ; A = 1 ; if A = 0 then B = "1" ; B = "12345" ; run ; proc contents data=TEST ; run ; if 文の中の B = "1" ; は実行されませんが、dataステップの中で「初めて」変数 B が登場するタイミングです。しっくりこないかもしれませんが、ここが変数 B の長さが決定するタイミングで、長さは1バイトとなります。変数の長さは1バイトなので、最後の5バイトの文字列をすべて格納することはできません。 場合によってはバグの元にもなるかもしれないので、事前にlengthステートメントで、文字の長さを決めておくのが良いかと思います。 バグ発生経験者より自戒を込めて 参考サイト SAS Base Programmer 練習問題23 | study SAS

動かして覚える file ステートメント dropover , stopover オプション

イメージ
data ステップの file ステートメントには、出力ファイル1行あたりの最大バイト数を指定する lrecl= オプションがついています。デフォルトでは、この lrecl= オプションを超えた値を出力しようとすると、次の行に超えた分の値が書き込まれます。 data TEST ; length A $10. ; A = "1" ; output ; A = "1234567890" ; output ; A = "ABCDEFG" ; output ; run ; filename OUT "/folders/myfolders/test.txt" ; data _null_ ; set TEST ; file OUT lrecl=9 ; put A ; run ; dropover オプション lrecl= の値を超えたとき、該当の行を削除したい場合は、fileステートメントに dropover オプションを付けます。 68 data _null_ ; 69 set TEST ; 70 file OUT lrecl=9 dropover ; 71 put A ; 72 run ; NOTE: 出力ファイルOUT : ファイル名=/folders/myfolders/test.txt, 所有者名=root,グループ名=vboxsf, アクセス権限=-rwxrwx---, 更新日時=2015年07月22日 21時01分14秒 NOTE: 3レコードを出力ファイルOUTに書き込みました。 最小レコード長は0です。 最大レコード長は7です。 NOTE: DROPOVERオプションを指定しているため、出力の一部を無視しました。 NOTE: データセットWORK.TESTから3オブザベーションを読み込みました。 NOTE: DATAステートメント処理(合計処理時間): 処理時間

ソート処理の処理時間を早く、メモリ消費を抑えたい - sort プロシジャ noequals オプション (非安定ソート) - SAS

mergeステートメントの前処理としてお馴染みの sort プロシジャについて、noequals オプションのご紹介です。 noequals オプションを付けることで、非安定ソートを行うことができます。デフォルトの設定では equals で、安定ソートが設定されています。noequals の最大のメリットは、デフォルトの equals と比べて、 CPU時間が短く、メモリが少なくすむことです! さて、そもそも、安定ソートとはなんでしょう。安定ソートとは、Wikipedia先生から引用しますと、 安定ソート(あんていソート、stable sort)とは、ソート(並び替え)のアルゴリズムのうち、同等なデータのソート前の順序が、ソート後も保存されるものをいう。つまり、ソート途中の各状態において、常に順位の位置関係を保っていることをいう。 たとえば、学生番号順に整列済みの学生データを、テストの点数順で安定ソートを用いて並べ替えたとき、ソート後のデータにおいて、同じ点数の学生は学生番号順で並ぶようになっている。 安定ソート | Wikipedia という感じです。ソートする前の並び順が維持されるのが安定ソート。ソートする前の並び順が無視されるのが非安定ソートです。 Wikipedia の例を元にサンプルデータを作ってみます。データは学籍番号順に並んでいます。 学籍番号 点数 001 80 002 90 003 80 004 100 005 90 006 80 上記のサンプルデータを点数で安定ソートしてみます。学籍番号の順番は維持されています。 学籍番号 点数 001 80 003 80 006 80 002 90 005 90 004 100 非安定ソートしてみると、点数の順に並んでいますが、安定ソートと並び順が異なります。(例のために並び順が異なるようにしていますが、一致することもあります。) 学籍番号 点数 001 80 006 80 003 80 005 90 002 90 004 100 proc sort noequals テストコード SASプログ

NOTE: 変数◯は初期化されていません。~SASログ入門 #1~

イメージ
SASのログの中には、バグになるかもしれない / バグかもしれないメッセージが、ERROR や WARNING ではなく、通常メッセージの NOTE で出力することがあります。そのメッセージを見逃してしまうと、後々、バグになる・・・かもしれません。 では、チェックすべき NOTE: メッセージとはどんなものなのか。 「きっと役立つ、バグになりそうなNOTE:のチェック | SAS Utility」 にて、そういったNOTE: メッセージの一覧がご紹介されています。これらのメッセージについて、ひとつずつ、メッセージを出力させるためのSASプログラムと簡単な解説を添えてご紹介していきたいと思います。 今回、ご紹介しますのは、「 NOTE: 変数◯は初期化されていません。 」です。 59 data TEST ; 60 A = B ; 61 run ; NOTE: 変数Bは初期化されていません。 NOTE: データセットWORK.TESTは1オブザベーション、2変数です。 NOTE: DATAステートメント処理(合計処理時間): 処理時間 0.00 秒 CPU時間 0.01 秒 変数として、まだ作成されていない B を変数 A に代入しようとしているため、該当のメッセージが出力されています。このとき、dataステップの実行は止まらず、後続の処理が実行され、データセット TEST は作られてしまいます。変数 A, B には欠損値が格納されて出力されます。 上記の動作はデフォルトでの動作で、初期化されていない変数があったときの動作は、オプションで設定することができます。そのオプションが、varinitchk オプションです。nonote, note(デフォルト), warning, error の4種類が設定できます。 varinitchk 設定値 ログメッセージ dataステップ nonote なし 続行 note (デフォルト) NOTE: 続行 warning (省略: war

missingオプション - 数値欠損値の出力結果を . ドットから変更する - SAS

イメージ
数値の欠損値は、デフォルトで、. で出力されますが、別の文字にしたいときは、missingオプションを使うと、別の文字に変更することができます。値は、1文字だけ設定することができます。 options missing="M" ; data TEST ; length B $10. C $10. ; A = 1 ; B = "ABCDEFG" ; C = "123456" ; output ; A = 2 ; B = "09"x || "BBB" ; C = "1,2,3" ; output ; A = 3 ; B = "B," || "09"x || ",B" ; C = "" ; output ; A = . ; B = "" ; C = "" ; output ; run ; filename OUT "/folders/myfolders/test.txt" ; data _NULL_ ; set TEST ; file OUT dlm="09"x dsd ; put A ~ B ~ C ~ ; run ; これで、数値の欠損値の出力を変更することができました。しかし、特殊欠損値の場合は、変更されませんのでご注意ください。 options missing=" " ; data TEST1 ; A = . ; B = "" ; C = .M ; D = .A ; run ; filename OUT "/folders/myfolders/test1.txt" ; data _NULL_ ; set TEST1 ; file OUT dlm="09"x dsd ; put A ~ B ~ C ~ D ~ ; run ; 参考サイト

動かして覚える file ステートメント dsd オプション / ~ チルダ修飾子 ~値にダブルクォーテーションを付ける~ - SAS

イメージ
SASデータセットの内容を CSVファイルに書き出して、エクセルに読み込ませたい、というとき、値の中にカンマがあるとエクセルにうまく読み込んでくれません。どんな感じで読み込まれてしまうのか。試しに、DATAステップの file ステートメントと put ステートメントで、CSV ファイルを作ってみましょう。 ファイルの出力 - カンマ区切り data TEST ; length B $10. C $10. ; A = 1 ; B = "ABCDEFG" ; C = "123456" ; output ; A = 2 ; B = "09"x || "BBB" ; C = "1,2,3" ; output ; A = 3 ; B = "B," || "09"x || ",B" ; C = "" ; output ; A = . ; B = "" ; C = "" ; output ; run ; filename OUT "/folders/myfolders/test.txt" ; data _NULL_ ; set TEST ; file OUT dlm="," ; put A B C ; run ; ※ "09"x = タブ 作成した CSV ファイルをエクセルにカンマ区切りで読み込ませてみると、値がずれて読み込まれてしまいます。 ファイルの出力 - カンマ区切り dsd オプション付き カンマを値として読み込ませるには、ダブルクォーテーション " で囲む必要があります。ダブルクォーテーションを付けるために、file ステートメントに dsd オプションを付けます。dsd オプションは値にカンマがある場合、ダブルクォーテーションを付けてくれます。 data _NULL_ ; set TEST ; file OUT dlm=&