2015年12月24日木曜日

SASでクリスマスツリーを描いてみる



SGPLOTプロシジャで遊んでみました。

HTML出力が有効になっている前提です。
バージョンや環境によってうまく表示されないかも。。


*** ツリー描画用データ作成 ;
data TREE;
input X Y1-Y5;
cards;
0 1 0 -1 -2 -4
;
run;

*** ツリー描画 ;
title ;
proc sgplot data=TREE noautolegend;
   scatter x=X y=Y1 /  markerattrs=(symbol=starfilled size=0.8cm color=yellow);
   scatter x=X y=Y2 /  markerattrs=(symbol=trianglefilled size=1cm color=green);
   scatter x=X y=Y3 /  markerattrs=(symbol=trianglefilled size=2cm color=green);
   scatter x=X y=Y4 /  markerattrs=(symbol=trianglefilled size=3cm color=green);
   scatter x=X y=Y5 /  markerattrs=(symbol=squarefilled size=0.6cm color=brown);
   inset "Happy Holidays !!"/ position=bottom textattrs=(size=50cm);
   xaxis min=-3 max=3  display=none;
   yaxis min=-5 max=1  display=none;
run;




雪も降らせてみました。(SAS9.4以上で動作します)

*** ツリー描画用データ作成 ;
data TREE;
input X Y1-Y5;
cards;
0 1 0 -1 -2 -4
;
run;

*** ゆき描画用データ作成 ;
data SNOW;
  call streaminit(123);
  do X=-3 to 3 by 0.2;
     SNOW = rand('uniform')*8-4;
     output;
  end;
run;

data DT1;
  set TREE SNOW;
run;

*** ツリーとゆき描画 ;
title ;
proc sgplot data=DT1 noautolegend;
   styleattrs wallcolor=black;
   scatter x=X y=Y1 /  markerattrs=(symbol=starfilled size=0.8cm color=yellow);
   scatter x=X y=Y2 /  markerattrs=(symbol=trianglefilled size=1cm color=green);
   scatter x=X y=Y3 /  markerattrs=(symbol=trianglefilled size=2cm color=green);
   scatter x=X y=Y4 /  markerattrs=(symbol=trianglefilled size=3cm color=green);
   scatter x=X y=Y5 /  markerattrs=(symbol=squarefilled size=0.6cm color=brown);
   scatter x=X y=SNOW / markerattrs=(symbol=circlefilled size=0.1cm color=white);
   inset "Happy Holidays !!"/ position=bottom textattrs=(color=white size=50cm);
   xaxis min=-3 max=3  display=none;
   yaxis min=-5 max=1  display=none;
run;


単純な仕組みですが、散布図のシンボルを★▲■●にしてサイズを大きくして表示させています。


2015年12月18日金曜日

TITLEステートメントで左寄せしたり書式を設定したりする。



(※書式設定はHTMLやRTF等の一部出力のみ対応しています)


まず普通に出力した場合、タイトルは中央寄せになります。

title "あいうえお" ;
proc print data=SASHELP.CLASS (obs=5);
run;






① NOCENTERオプション


NOCENTERオプションを設定すると、タイトルやプロシジャの結果などすべて左寄せになります。
(ちなみにSAS Studioだと何故か設定できなかったり、できたり挙動がおかしい。。)

options nocenter;

title "あいうえお" ;
proc print data=SASHELP.CLASS (obs=5);
run;

options center;



CENTERオプションで中央寄せ(デフォルト)に戻せます。




② TITLEステートメントのオプション


TITLEステートメントには書式を設定するオプションがあります。


構文
 TITLE  書式  "タイトル" ;



書式には以下が設定できます。

書式設定内容
COLOR=色文字色
BCOLOR=色文字の背景色
FONT="フォント"フォント
HEIGHT=サイズフォントサイズ
BOLD太字で表示
ITALICイタリックで表示
JUSTIFY= LEFT | CENTER | RIGHT文字の位置
LINK = 'URLを指定'ハイパーリンクの設定
UNDERLINE = 1 ~ 3下線
SAS/GRAPHでは数字によって下線の太さが変わり、HTML等のODS出力ではどの数字でも太さは変わらないようです。



いくつか例を見ていきましょう。


  • タイトルだけ左寄せにする。
title justify=left "あいうえお" ;
proc print data=SASHELP.CLASS (obs=5);
run;




  • 文字ごとに右寄せしたり左寄せしたりする。
title justify=left "あい" justify=center "うえ"  justify=right "お";
proc print data=SASHELP.CLASS (obs=5);
run;




  • その他フォント等も設定できる。
title color="red"  font="MS P明朝"  height=20pt  "あいうえお" ;
proc print data=SASHELP.CLASS (obs=5);
run;




FOOTNOTEでも同様の設定が行えます。


2015年12月15日火曜日

【意外に使えるCATT関数】各文字の末尾の半角スペースを削除して連結する



構文


   CATT( 文字1 , 文字2 , ・・・)


各文字の末尾の半角スペースを削除して連結します。



簡単な例

data DT1;
    length VAR1 $10.;
    VAR1 = catt( 'aa' , '  -  ' , 'bb' );
run;

 VAR1  
 aa  -bb 



CATT関数が役に立つ例

data DT2;
    A = "aaa";
    B = "bbb";
run;
 aaa 
 bbb 

上のデータから、以下のように加工した変数VAR1を作成したいとします。

 A  
 B  
VAR1  
 aaa 
 bbb 
 aaa (bbb) 

(カッコの前に半角スペースを入れて連結したい)


*** 導出例 ;
data DT3;
    set DT2;    
    length VAR1 $20.;
    VAR1 = catt( A, ' (', B, ')' );
run;

こういう場合はCATT関数が一番スッキリとしたプログラムになると思います。



あわせて読むと役立つ記事

PUT関数の小技
半角スペースを取り除いてくれる関数達



2015年12月7日月曜日

REPORTプロシジャ入門6:要約行の追加【BREAK, RBREAK】



BREAK・RBREAKを使って、合計や平均などの要約行を追加する事ができます。

まずは構文から。




  要約行を追加  【RBREAKステートメント】


※ 黄色部分が要約行





















ざっくり解説

  RBREAK  BEFORE   /  SUMMARIZE ;

先頭に要約行を追加します。
「RBREAK  AFTER」 だと末尾に追加されます。


  DEFINE  変数2  /  ANALYSIS  統計量 ;

要約値の計算は、ANALYSISオプション等の「要約統計量の出力」が設定されたものに対して行われます。

📝
ANALYSISオプションは予期せぬ結果になりやすいので以下記事も要確認。
REPORTプロシジャ入門10:数値変数の落とし穴




 グループ毎に要約行を追加  【BREAKステートメント】























ざっくり解説

  DEFINE  変数1 / ORDER ;

まず変数1のグループ毎に要約行を追加するため、ORDERオプションで並び替えておく。

📝
ORDERオプションは欠損値のオブザベーションが除外されたり、並び順がおかしくなる注意点もあるので以下記事も要参照。
  BREAK  BEFORE  変数1  /  SUMMARIZE ;

変数1のグループ先頭に要約行を追加します。
「BREAK  AFTER  変数1」 だとグループ末尾に追加されます。


  DEFINE  変数2  /  ANALYSIS  統計量 ;

要約値の計算は、ANALYSISオプション等の「要約統計量の出力」が設定されたものに対して行われます。

📝
こちらも以下記事の通り、ANALYSISオプションが予期せぬ結果になりやすいので注意。

具体例

*** サンプルデータ ;
data DT1;
input A$ B @@;
cards;
aaa 10 aaa 20 aaa 30 bbb 40 bbb 50 bbb 60
;
 A  
 B  
 aaa
 10 
 aaa 
 20 
 aaa
 30
 bbb 
 40 
 bbb
 50
 bbb
 60

*** グループ毎に要約行を追加 ;
proc report data=DT1 nowd spanrows;
   column A B;
   define A / order;
   define B / analysis sum;
   break after A / summarize;
run;

分かり辛いですが、4行目と8行目が要約行です。


次回紹介予定のCOMPUTEステートメントを使えば以下のように要約行に「Total」って文字を入れて分かり易くすることも出来ます。

proc report data=DT1 nowd spanrows;
   column A B;
   define A / order;
   define B / analysis sum;
   break after A / summarize;
   compute after A;
        A="Total";
   endcomp;
run;


📝
この方法の注意点は、length以上の値を入れると文字切れしてしまうところ。
今回の例だと変数Aのlengthは$8なので「A="Total"」は入るけど、「A="Total (Summary Line)"」とかってすると、$8をオーバーしているので先頭8バイトで文字切れして「"Total (S"」と出力されます。



おまけ

PAGEオプションを指定するとグループ毎に改ページを挿入できます。

proc report data=DT1 nowd spanrows;
   column A B;
   define A / order;
   define B / analysis sum;
   break after A / page;
run;




REPORTプロシジャ入門記事一覧

1.基本構文【COLUMN, DEFINE】
2.ヘッダーの設定
3.並べ替え・グループ化【ORDER, GROUP】
4.集計【ANALYSIS】
5.転置集計【ACROSS】
6.要約行の追加【BREAK, RBREAK】
7.計算項目の追加【COMPUTE】
8.書式の設定【STYLE=】
9.特定セルの書式設定【CALL DEFINE】
10.数値変数の落とし穴