2019年3月29日金曜日

【SAS入門】比較演算子



SASで値同士の比較を行う比較演算子について簡単にまとめておきます。




比較演算子

  演算      演算子    
  等しい   = 
  等しくない    ^= 
  より大きい    >
  より小さい   <
  以上   >=
  以下    <=
  いずれかと等しい    IN
  いずれとも等しくない    ^IN






data DT1;
   A = 1;
   B = 2;

   if  A  =  B          then  FLG1=1;     /* AとBが等しいか */
   if  A ^= B          then  FLG2=1;     /* AとBが等しくないか */
   if  A  >  B          then  FLG3=1;     /* AがBより大きいか */
   if  A  <  B          then  FLG4=1;     /* AがBより小さいか */
   if  A >= B          then  FLG5=1;     /* AがB以上か */
   if  A <= B          then  FLG6=1;     /* AがB以下か */
   if  A  in (1,2,3)   then  FLG7=1;     /* Aが1,2,3のいずれかか */
   if  A ^in (1,2,3)  then  FLG8=1;     /* Aが1,2,3のいずれでもないか */ 
run;


この例のように、IFステートメントやWHEREステートメントの中で条件式を書くときに、比較演算子を用います。


ただし、、

「IN」を使う際、「A IN (1,2,3)」みたいに右辺に値を指定するのはいいけど、「A IN (B,C,D)」みたいに右辺に変数を指定することはできないっぽいのでご注意を。




余裕があったらこちらもどうぞ

NOT演算子で条件の否定をする




2019年3月25日月曜日

【SAS入門】データセットと変数の命名規則




データセットや変数に名前をつける際のルールを解説したいと思います。
以下SAS9.4でのデフォルトの命名規則です。



  •  半角で32文字以内

  •  先頭は「A~Z」「_」のいずれか
  •  以降は「A~Z」「_」「0~9」のいずれかを指定可

    例)
    ・OK …「ABC」「_ABC」「A123」
    ・NG …「123」


  •  大文字・小文字の区別はなく、どちらでもOK
  • ・例えば「AGE」「Age」「age」はすべて同じ変数と見なされる。


  • 「_N_」や「_ALL_」などSASが内部で管理している名前(予約語)があるので、なるべく「_なんちゃら_」というデータセットや変数は作らない事!



この辺のルールは使ってくうちに身についてくると思います。




2019年3月19日火曜日

【小技】ODSグラフの保存時、ファイル名にBY値を入れる




SAS9.4M5からの機能です。
以下のプログラムをご覧ください。


proc sort data=sashelp.class out=class;
   by age;
run;

options nobyline;
ods graphics  /  reset=index imagename='test_#byval1'  outputfmt=png;
ods html close;
ods listing gpath="出力するパスを指定";

   proc sgplot data=class;
      scatter x=height y=weight;
      by age;
   run;

ods listing close;
ods graphics  /  reset=all;
ods html;



「ODS GRAPHICS」の「IMAGENAME=」の中で#BYが使えるようになりました!
上の例では「test_11.png、test_12.png・・・」という感じでファイルが作られます。


「OPTIONS NOBYLINE」と#BYの具体的な挙動は以下のリンク記事を参照下さい。



ただし!!

本来は、#BYLINEと#BYVARも使えるはずなんですが、不具合で環境によっては正しく動きません。
具体的には

・#BYLINEを指定するとログにWARNINGがでて環境によってはファイル名もおかしくなる。
・#BYVARを指定すると、BY変数にラベルがついてても、ラベルではなく変数名が返される。

テクニカルサポートに確認して将来のバージョンで修正するよって回答頂いたんで、現状は#BYVALのみを使うほうがよさそうです。
不具合解消されてたらこの記事に追記できたらと思います。



2019年3月14日木曜日

グラフに画像を貼り付ける【GTL編】




以下は数年前に堀切菖蒲園てとこで撮った花菖蒲です。超時期外れですが。




この写真をGTLのDRAWIMAGEステートメントを使ってグラフ内に描画してみます。

proc template ;
    define statgraph MYTEMP ;
    begingraph ;

    layout overlay;
       scatterplot x=petallength y=petalwidth / group=species name="leg1" markerattrs=(symbol=circlefilled);
       drawimage "保存先のパス\flower.JPG" / transparency=0.7
                                                                       width=100
                                                                       height=100
                                                                       sizeunit=percent
                                                                       drawspace=GraphPercent;
       discretelegend "leg1" / title="Age";
    endlayout;

    endgraph;
    end;
run;

proc sgrender data=SASHELP.IRIS template=MYTEMP;
run;


使ったデータはSASHELP.IRISなので、写真とグラフの内容が合ってますね
(厳密に言うと写真とSASHELP.IRISは別の種だけど、同じアヤメ科アヤメ属の植物ということで・・)


設定してるオプションについてもざっくり説明をしておきます。

  • transparency=0.7 … 透明度を0.7に
  • width=100 height=100 sizeunit=percent … 幅と高さを100%に
  • drawspace=GraphPercent … 画像の描画範囲をグラフエリア全体に



これって応用範囲が広くて、例えばグラフの中にグラフを貼ったり、以下のように会社とかのロゴをグラフの隅に貼り付けたりとか、色々できます。

proc template ;
    define statgraph MYTEMP ;
    begingraph ;

    entrytitle "";
    layout overlay;
       scatterplot x=petallength y=petalwidth / group=species name="leg1" markerattrs=(symbol=circlefilled);
       drawimage "貼り付けるファイルを指定" / transparency=0.5
                                                                          width=40
                                                                          sizeunit=percent
                                                                          drawspace=datapercent
                                                                          x=0 
                                                                          y=100
                                                                          anchor=topleft;
        discretelegend "leg1" / title="Age";
    endlayout;

    endgraph;
    end;
run;

proc sgrender data=SASHELP.IRIS template=MYTEMP;
run;

  • transparency=0.5 … 透明度を0.5に
  • width=40 sizeunit=percent … 幅を40%に
  • drawspace=datapercent x=0 y=100 anchor=topleft … 画像の描画範囲をPLOTエリアにして、左上に表示されるよう調整



2019年3月6日水曜日

【小技】ODS EXCELでシート名に「#BYLINE」とかが設定できる。




以下をご覧ください。

ods excel file="出力するパスを指定\test1.xlsx"  options(  flow="table" sheet_name='#byval1' );

proc report data=sashelp.cars;
     define _character_ / style(column)={tagattr='type:String format:@'};
     by make;
run;

ods excel close;



BY値ごとにシートを分けて出力してるんですが、シート名にBY値を設定しています。



この例のように実は、SHEET_NAME=オプションには「#BYLINE」「#BYVAR」「#BYVAL」が設定できちゃいます。
リファレンスには何故か書いてなかったと思いますが。


#BYって何?って方は以下を参照ください。
TITLEステートメントでBY値を表示する「#BYLINE、#BYVAL、#BYVAR」



See also
ODS EXCELで文字変数を「文字列」として出力したい。
ODS EXCELで「セル内改行」されてしまうところを「セル内折り返し」に変える



2019年3月1日金曜日

TITLEステートメントでBY値を表示する「#BYLINE、#BYVAL、#BYVAR」




前回は「OPTIONS NOBYLINE」と「#BYLINE」を使ってBYグループ毎に、
  • 改ページを挿入
  • TITLEにBY値を表示
というのをやってみせました。


*** サンプルデータ ;
proc sort data=sashelp.class out=class;
   by age;
run;

*** 「OPTIONS NOBYLINE」と「#BYLINE」を使う ;
options nobyline;
title "#byline";

proc print data=class;
   by age;
run;















そして今回紹介したいこと、
TITLEステートメントには「#BYLINE」以外にも「#BYVAL」「#BYVAR」というのが指定できます。

指定TITLEに表示される値
#BYLINE

BY変数名=BY値
  • 変数にラベルが当てられてる場合はラベルを表示
  • 変数にFORMATが当てられてる場合はFORMATをあてた値を表示

#BYVAL( BY変数名 )
 or
#BYVALn
指定したBY変数の値
  • 変数にFORMATが当てられてる場合はFORMATをあてた値を表示

#BYVAR( BY変数名 )
 or
#BYVARn
指定したBY変数の変数名
  • 変数にラベルが当てられてる場合はラベルを表示




「#BYVALn」と「#BYVARn」の「n」は何個目のBY変数かを指定します。
例えば以下のように書いた場合、

options nobyline;
title "#byvar2";
proc print data=aaa;
   by xx yy;
run;

「#BYVAR2」の「2」は2個目のBY変数「YY」を指しています。





options nobyline;
title "#byval(age) years old";
proc print data=class;
   by age;
run;



options nobyline;
title "#byvar1 = #byval1.years old";
proc print data=class;
   by age;
run;



「#byval1.years」みたいな感じで、#BYと任意のテキストの間にドットを入れてくっつけて表示することも出来ます。