2019年11月28日木曜日

[SGPLOT] BY値ごとにグラフを作成する際、軸やシンボルなどをグラフ間で揃えたい






これは SGPLOT をよく使用する方なら一度は困るところではないでしょうか?
まずは、以下の失敗例をご覧ください。



失敗例

/* Sample Data */
proc sort data=sashelp.class (obs=5) out=class;
    by age;
run;

/* BY値ごとにグラフを作成 */
ods graphics / height=400 width=400;

proc sgplot data=class;
    scatter x=height y=weight / group=sex markerattrs=(symbol=circlefilled);
    by age;
run;




「BYステートメント」によって、変数「AGE」の値ごとにグラフを作成しています。
また「GROUP=オプション」によって、変数「SEX」の値ごとにシンボルカラーを変えています。



ここで気になるのが、、

  • X軸とY軸の目盛がグラフ間で異なっている。
  • シンボルの色がグラフ間で異なっている(SEX=Fのシンボルが、AGE=13の時は青、AGE=14の時は赤になっている)



そうなんですよ、、BY値ごとにグラフを作成すると、軸やシンボルはグラフ間で統一してくれません。
でも解決方法は簡単!



成功例

proc sgplot data=class uniform=all;
    scatter x=height y=weight / group=sex markerattrs=(symbol=circlefilled);
    by age;
run;




UNIFORM=オプション」を指定するだけ!
このオプションは「BY値ごとに作成したグラフのどこを統一させたいか」を設定します。
設定値には以下があります。



UNIFORM=

 設定値 設定内容 
SCALEX軸を統一 and Y軸を統一
XSCALEX軸を統一
YSCALEY軸を統一
GROUP「GROUP=オプションに指定した変数の値ごとにシンボルや線種などを統一
XSCALEGROUP「XSCALE」と「GROUP」の両方を設定
YSCALEGROUP「YSCALE」と「GROUP」の両方を設定
ALL上記のすべてを統一



2019年11月20日水曜日

外部ファイルの属性情報(更新日時やファイルサイズなど)を取得する方法 (FOPEN関数編)




※今回使用する「FOPEN関数」を使用すると「SASが裏で対象のファイルを開く」点にご注意ください。
開いてる間はSAS以外から編集が出来ないなども起こるかもしれません。




では以下 SAS Ondemand for Academics 上に配置したファイルの属性情報を取得してみます。









filename test 'ファイルのパス/mysas/sakura1.jpg';

data out1;
     /* ファイルを開く */
     fid = fopen( 'test' );

     /* ファイル属性を取得 */
     length name $50. info $1000.;

     do  i = 1 to foptnum( fid );
          name = foptname( fid, i );
          info = finfo( fid, name );
          output;
     end;

     /* ファイルを閉じる */
     rc = fclose( fid );

     keep name info i;
run;


※ 取得される属性情報は、環境や言語設定などによって異なります。
色々な環境で実行する可能性がある場合は、ご注意ください。







解説


FOPEN関数でファイルを開きます。

 FOPEN( "開きたいファイルが割り当てられたファイル参照名" )

戻り値として、開いたファイルの識別番号が返されるので、その番号を変数FIDに入れてます。
この識別番号は、以降の処理で使います。



FOPTNUM関数でファイルの属性数を取得できます。

 FOPTNUM( ファイルの識別番号 )

ここで、得られた属性数だけDOループをまわして、以下の関数で全ての属性値を取得しています。



FOPTNAME関数でファイル属性名を取得できます。("作成日"や"更新日"といった属性名の部分)

 FOPTNAME( ファイルの識別番号 , 属性番号 )



FINFO関数でファイル属性値を取得できます。

 FINFO( ファイルの識別番号 , ファイル属性名 )



FCLOSE関数でファイルを閉じます。

 FCLOSE( ファイルの識別番号 )


2019年11月10日日曜日

ライブラリ内の全データセットから、指定したデータセットだけ残して全て削除する





PROC DATASETS の「SAVEステートメント」でタイトルにある通りのことが出来ます。
あまり知られていない機能なので、覚えておくと便利です。



以下では、WORKのDT1~DT5のうち、DT1だけ残して全部削除しています。

data DT1 DT2 DT3 DT4 DT5;
run;


proc datasets lib=WORK nolist memtype=data;
    save DT1;
quit;



データセットだけでなくビューも含めたい場合は「MEMTYPE=」に「VIEW」を追記すればOK

proc datasets lib=WORK nolist memtype=(data view);
    save DT1;
quit;



2019年11月7日木曜日

SASデータセットを削除するDATASETSプロシジャ






データセットを削除する方法1

PROC  DATASETS  LIB=ライブラリ名   MEMTYPE=DATA  NOLIST;
     DELETE  データセット名1  データセット名2 ・・・ ;
QUIT;

  • 「DELETEステートメント」に削除したいデータセットを列挙します。



proc datasets lib=work memtype=data nolist;
  delete dt1 dt2 dt3;
quit;






データセットを削除する方法2  (注意事項あり)

PROC  DATASETS  LIB=ライブラリ名  MEMTYPE=DATA  KILL  NOLIST;
QUIT;


  • 「KILLオプション」でライブラリ内の「全てのデータセット」を削除します。
  • 「全てのデータセット」なので、たとえば「DELETEステートメント」で削除するデータセットを指定していても意味はなく、ライブラリ内の全データセットを削除します。





ちなみに

データセットだけでなくビューも含めて削除したい場合は「MEMTYPE=」に追記すればOK

proc datasets lib=work memtype=(data view) kill nolist;
quit;




2019年11月1日金曜日

カタログからフォーマットを削除する方法






フォーマットを削除する方法1

PROC CATALOG  CAT=ライブラリ名.カタログ名;
     DELETE  フォーマット名1  フォーマット名2 ・・・ / ET=フォーマットの種類;
RUN;


  • 「DELETEステートメント」に削除したいフォーマットを列挙します。
  • 「ET=オプション」に削除する「フォーマットの種類」を指定します。
  • 「フォーマットの種類」には以下があります。
    • FORMAT   ...  数値フォーマット
    • FORMATC ...  文字フォーマット
    • INFMT       ...  数値インフォーマット
    • INFMTC    ...  文字インフォーマット



/* Sample */
proc format;
   value     a      1      = "aaa" ;
   value     $b   "aaa" = "bbb" ;
   invalue   c     "aaa" = 1 ;
   invalue   $d   "aaa" = "bbb" ;
run;

/* フォーマットの種類ごとに削除 */
proc catalog cat=work.formats;
    delete a / et=format;
    delete b / et=formatc;
    delete c / et=infmt;
    delete d / et=infmtc;
quit;



ちなみに、以下のように書くことも可能です。

proc catalog cat=work.formats;
    delete a (et=format)  b (et=formatc) c (et=infmt) d (et=infmtc);
quit;






フォーマットを削除する方法2  (注意事項あり)

PROC CATALOG  CAT=ライブラリ名.カタログ名  KILL FORCE;
RUN;


  • カタログ内の「全エントリー」を削除します。
  • 「全エントリー」とはフォーマットだけでなくマクロなどのあらゆるエントリーを含みます。
  • 「KILL」オプションは PROC CATALOG 内の他のオプションやステートメントより先に動作します。たとえばDELETEステートメントで削除するフォーマットを指定していても意味はなく、カタログ内の全エントリーを削除してしまいます。