2019年1月30日水曜日

HMS関数で時間値を簡単に作る




時間値の作り方について質問を頂いたので簡単に説明をしたいと思います。
まずHMS関数を使うと、簡単に時間値を作れます。


構文
HMS,  ,   )



data DT1;

   * 時 ;
   H   = 20;

   * 分 ;
   M   = 10;

   * 秒 ;
   S    = 05;

   * 時間値を作成 ;
   format TM1 TM2 time10. ;
   TM1 = hms( H, M, 0 );
   TM2 = hms( H, M, S );
run;


S
TM1 
TM2 
  20  
  10  
  05 
  20:10:00  
  20:10:05  


また特定の時間値を作りたい場合は、以下のような書き方が楽。
http://sas-boubi.blogspot.com/2018/03/blog-post.html

data DT2;
   format TM1 time10. ;
   TM1 = '20:10:05't;
run;

2019年1月25日金曜日

ODS EXCELで「セル内改行」されてしまうところを「セル内折り返し」に変える




前回の記事「ODS EXCELで文字変数を「文字列」として出力したい。」に続き、もう1個「ODS EXCEL」で知っといた方がいいオプションを紹介します。


以下の例をご覧ください。

ods excel file="出力するパスを指定\test1.xlsx";
proc print data=sashelp.cars (obs=5);
  var model / style={cellwidth=90};
run;
ods excel close;


変数MODELについて、横幅を縮めてEXCELに出力したところ、横幅に合わせてセル内改行されちゃいました。


そこで以下のオプションを追加すると、、

ods excel file="出力するパスを指定\test2.xlsx" options(flow="table");
proc print data=sashelp.cars (obs=5);
  var model / style={cellwidth=90};
run;
ods excel close;


ちゃんと1行で入って、セル内折り返しに切り替わりました!


横幅の関係でセル内改行が入ってしまうところを、セル内折り返しにしてくれるオプションです。
(変数値自体に改行が入ってる場合、改行は残ります)



2019年1月24日木曜日

ODS EXCELで文字変数を「文字列」として出力したい。




(※今回の内容は、SASやEXCELのバージョン・環境によってうまくいくか未確認なので各時の環境でご確認下さい)

「ODS EXCEL」でプロシジャの結果をEXCELに出力できますが、文字変数の書式が崩れるのが問題なんですよね。


例を見ていきます。

* Sample data ;
data test;
input x$;
cards;
001
002
003
.
;



以下は失敗例。

* NG  ;
ods excel file="出力するパスを指定\test1.xlsx" options( flow="tables" );
proc report data=test;
        define x / display;
run;
ods excel close;


*--- test1.xlsx ------------------------------------;


EXCELに出力すると、文字変数の書式が「標準」になってしまう上に、
変数Aは「001」→「1」みたいに数値に変換されちゃいます。



実は「ODS TAGSETS.EXCELXP」でも同様の問題があり、データステップ100万回で解決法を紹介してます。
http://sas-tumesas.blogspot.com/2014/01/tagsets-excelxpods.html


しかし、「ODS EXCEL」ではこの書き方ではダメっぽくて、色々調べたところ以下SAS社の出してるProblem Noteにどんぴしゃな説明がありました。
* OK ;
ods excel file="出力するパスを指定\test2.xlsx" options( flow="tables" );
proc report data=test;
        define x / display style(column)={tagattr='type:String format:@'};
run;
ods excel close;


*--- test2.xlsx ------------------------------------;

  • 「type:String」を入れると「001」のまま出力してくれました、、けどセルの書式が「文字列」になってくれません。実際の見た目とセルの書式が異なってしまい変な感じです。
  • そこで「format:@」を追記すると、「文字列」になってくれました。
  • ちなみに以下の通り、欠損値の部分は「文字列」になってくれませんでした。



あと、この「type:String」「format:@」の指定の順番を逆にすると環境によっては書式が「文字列」になってくれませんでした。各環境でちゃんと動くか確認が必要です。。



2019年1月18日金曜日

【小ネタ】put _all_で自動変数を出力したくない。




超小ネタです。


「put _all_;」で全変数値をログに出力することが出来ますが、、

data a;
   a=1;
   b="xx";
   c="yy";
   put _all_;
run;

Log:
a=1 b=xx c=yy _ERROR_=0 _N_=1

自動変数(_ERROR_や_N_など)も出力されてしまいます。



そこで、以下で紹介した方法を使うと
https://sas-boubi.blogspot.com/2015/10/put.html

data a;
   a=1;
   b="xx";
   c="yy";
   put (_all_)(=);
run;

Log:
a=1 b=xx c=yy

何故か自動変数は出なくなります。なんでか知らないけど。


あ、今年もどうぞよろしくお願いいたします!



2019年1月11日金曜日

ODS GRAPHICSの設定を保存・復元する。




SAS9.4M3からODS GRAPHICSの設定を一時保存・復元する「PUSH・POPオプション」が追加されました。

本題に入る前に、まずは前提知識として「SHOWオプション」から紹介していきます。




SHOWオプション

ODS GRAPHICS / SHOW ;

  • 現在のODS GRAPHICS の設定をログに表示することが出来ます。


ods graphics / show ;



PUSHオプション

ODS GRAPHICS / PUSH ;

  • 現在のODS GRAPHICSの設定を一時保存することが出来ます。
  • PUSHオプションを指定する度に、その時点のODS GRAPHICSの設定を別々に保存することが出来ます。



/*** ① 現在のODS GRAPHICSの設定を見てみる ********/
ods graphics / show;

/* 設定を保存 */
ods graphics / push;



/*** ② ODSで出力される画像の幅を300pxに変更 ********/
ods graphics / width=300;
ods graphics / show;

/* 設定を保存 */
ods graphics / push;





POPオプション

ODS GRAPHICS / POP ;

  • 一時保存したODS GRAPHICSの設定を呼び出すことが出来ます。
  • POPオプションを指定する度に、PUSHで保存した設定の新しい方から順に呼び出されます。
  • つまり、PUSHで設定①、設定②、設定③と3回設定を保存した場合、POPでは設定③、設定②、設定①という順で呼び出される(スタックの原理)



/* 設定の呼び出し */
ods graphics / pop;
proc sgplot data=sashelp.class;
  scatter x=height y=weight;
run;

/* 設定の呼び出し */
ods graphics / pop;
proc sgplot data=sashelp.class;
  scatter x=height y=weight;
run;





役に立つ例

汎用マクロを作る際に便利です。以下の例をご覧ください。

%macro test;

  /* 現在のODS GRAPHICSの設定を保存しておく */
  ods graphics / push;

  /* SGPLOT */
  ods graphics / reset=all height=500 width=500;
  proc sgplot data=sashelp.class;
       scatter x=weight y=height;
  run;

  /* マクロ実行前のODS GRAPHICSの設定に戻す */
  ods graphics / pop;

%mend;

  • マクロの最初にPUSH、最後にPOPを置いています。
  • これにより、いくらマクロの中でODS GRAPHICSの設定をいじっていても、マクロ実行後には設定を元に戻すことが出来ます。