proc formatのpictureステートメントの話②

例えば、よくあるのが、変化率とかのデータをレポートにした際に

1.51
0.2
-5.5
0

みたいな風にして出すと

「いや~、それでもいいんだけど、できればこういう風に見栄え良くしてくんない?簡単でしょ?」
といわれて

+1.51%
+0.20%
-5.50%
0.00%

っていう見本を提示されたりします。

やれとおっしゃるならやりましょう。

さて、こういう時に if 値>0 の時に、cats関数で先頭に+、お尻に%つけて、間の数字の桁数を、なんて分岐処理かいて、文字列操作関数と戯れていたら結構、面倒です。

とはいえ、ばっちり使えるフォーマットが、デフォルトでSASにあるのかをいちいち調べるのも面倒です。

じゃあパパっと作っちゃえという話です。

data Q1;
X=-5.52;output;
X=3.1;output;
X=0;output;
X=0.11;output;
X=-60;output;
X=100;output;
run;










というデータセットがあった場合、まず以下のようにフォーマットを作ります

proc format;
 picture FX(default=9)
 low-<0='009.99%'(prefix='-')
 0='009.99%'
 0<-high='009.99%'(prefix='+');
run;


pictureで作るフォーマットパターンは先頭に文字定性値を普通にはおけないので
prefix=で指定します。その場合、フォーマットの長さを定義しておかないと先頭がきれますので
(default=9)と最大9文字表示せっていにしてます。
0で表現しているところは、ないなら出すなってことで、9で表示しているとこはなかったらゼロパティングして出せという意味です。


で、それを使って普通にput関数で

data A1;
 set Q1;
 Y=put(X,FX. -L);
run;











結果OKです。
-Lは左詰めにしてくれるオプションです。いちいちleft関数とか空白除去とかしなくていいんです。



さて、この手の話でよくよく例にだされるのが、数字列を電話番号っぽく表示する話です。

data Q2;
X=1234567891;
run;

proc format;
 picture TELL(default=14)
 low-high='99)-9999-9999'(prefix='(');
run;

data A2;
 set Q2;
 format X TELL.;
run;





ってな感じです。

こんな風に、文字列操作関数でかなり加工が必要そうな処理も、簡単にかけちゃうのが
pictureステートメントの凄いところです。

なんかイメージ的には正規表現書くのに似てますよね。



0 件のコメント:

コメントを投稿