投稿

数値定数、SAS日付定数、SAS時間定数、SAS日時定数の表現方法

イメージ
数値定数、SAS日付定数、SAS時間定数、SAS日時定数の色々な書き方のご紹介です。 数値定数 title "数値定数" ; data TEST_NUM ; N = 1234 ; output ; N = -123 ; output ; N = +123 ; output ; N = 0010 ; output ; N = 0.123 ; output ; N = 1E10 ; output ; /* 指数表記 : 1 × 10の10乗 = 10000000000 */ N = 2.1E2 ; output ; /* 指数表記 : 2.1 × 10の 2乗 = 210 */ N = 1E-3 ; output ; /* 指数表記 : 2.1 × 10の-3乗 = 0.001 */ N = 2.5E-2 ; output ; /* 指数表記 : 2.5 × 10の-2乗 = 0.025 */ N = 0x ; output ; /* 16進数 : 10進数 0 */ N = 010x ; output ; /* 16進数 : 10進数 16 */ N = 0FFx ; output ; /* 16進数 : 10進数 255 */ N = 0FFFFx ; output ; /* 16進数 : 10進数 65535 */ N = . ; output ; /* 欠損値 */ N = .A ; output ; /* 特殊欠損値 A */ N = ._ ; output ; /* 特殊欠損値 _ */ run ; proc print data=TEST_NUM ; format N comma22.4 ; run ; SAS日付定数 title "SAS日付定数" ; data TEST_DATE ; DATE = '01JAN2015'd ; output ; /* 2015/01/01 */ DATE = '31AUG2015'd...

proc report 指定行(◯行目)を強調する - SAS

イメージ
proc report で指定した行(◯行目)だけを強調表現する方法です。 /* テストデータ */ data TEST ; do I=1 to 10 ; R = ranuni(int(datetime())) ; output ; end ; run ; ods rtf file="/folders/myfolders/test.rtf" ; proc report data=TEST nowd ; column I R ; define I / display ; define R / display format=12.9 ; compute I ; COUNT + 1 ; /* 5行目だけに適用 */ if COUNT = 5 then do ; call define(_ROW_, 'style', 'style=[Color=red BackgroundColor=Yellow]') ; end ; endcomp ; run ; ods rtf close ; compute内にて、変数 COUNT を用いて、行番号をカウントしています。if COUNT = 5 then で 5行目だけに、call define が実行されるようにします。call define では 文字色を赤、背景色を黄色にするように設定しています。 RTF の出力結果を確認すると、5行目だけちゃんと強調されています。 せっかくなので、もっと強調してみる style=[~] と、四角括弧の中に設定するスタイルを記載します。文字色、背景色の設定だけでなく、文字のスタイル、フォント、罫線のスタイルや色なども設定できます。 強調したい行をより強調表現してみましょう。 ods rtf file="/folders/myfolders/test.rtf" ; proc report data=TEST nowd style(header)=[Fontfamily='Couriel' FontWeight=bold FontSize=3 Backgrou...

NOTE: MERGEステートメントにBY値を繰り返すデータセットが複数あります。~SASログ入門 #3~

イメージ
データセットとデータセットの結合に使う みんな大好き mergeステートメントですが、n対n (多対多)の結合を行うことができません。正確には、n対n の結合をしようとすると、結合はできるのですが、SQLでの n対n の結合のように結合してくれません。 そんな、mergeステートメントで、n対n の結合をしてしまったとき、出てくるNOTEメッセージ「NOTE: MERGEステートメントにBY値を繰り返すデータセットが複数あります。」のご紹介です。 下記は、n対1 の結合をしようとして、間違えて n対n の結合をしてしまったサンプルコードです。 /* 顧客データ */ data CLIENT_MASTER ; infile cards dlm="," ; input LATEST_FLG CHANGED_DATE : date8. CLIENT_NO CLIENT_NAME : $20. BIRTH_DATE : date8. EMAIL_ADDRESS : $100. ; format CHANGED_DATE yymmddn8. BIRTH_DATE yymmddn8. ; cards ; 1,10DEC2015,001,JOHN,01JAN1980,TEST@TEST.com 0,12JUL2010,001,JOHN,01SEP1980,TEST@TEST.com 1,10DEC2015,002,Emily,01JAN1980,TESUTO@test.com 0,10DEC2015,002,Emily,01JAN1980, 0,10DEC2015,002,Emily,01JAN1981, 1,10DEC2014,003,Ann,12OCT1990,test@test.co.jp run ; /* 取引データ */ data TRANSACTION_PROCESS ; infile cards dlm="," ; input PROCESS_DT : datetime18. CLIENT_NO PRODUC...

環境によっては ls, ps の値を変えてしまうオプションがある・・・らしいので注意 - SAS

SAS 雲丹では変わらなかったのですが、下記のオプションを変更すると、ls, ps の値が変わってしまうようです。環境によっては起きないみたいです。 PAPERSIZE ORIENTATION TOPMARGIN BOTTOMMARGIN LEFTMARGIN RIGHTMARGIN 日本語オンラインヘルプには下記のように記載があります。 このオプションの値を変更すると、移植可能な LINESIZE=および PAGESIZE=システムオプションの値が変更される場合があります。 SAS 9.4 システムオプション:リファレンス 第3版(PDF) 自分の使っている環境が、これらのオプションを使用したとき、または proc optload を使用したとき、ps, ls の値が変わる環境なのかどうか、気をつけてみてください。 変わってしまう環境の場合は、ps, ls のオプションを再設定するように心掛けたり、上記のオプションたちを使わないようにするといったことが必要かもしれません。 参考サイト ODS出力時の用紙サイズや余白などを設定するオプション [まとめ] | SAS忘備録

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ステートメント処理(合計処理時間): 処理時間 ...