2021年7月16日金曜日

warterfall plotの棒が少ない時に間隔を狭くする話

 オプションの一発で解決する内容なのですが,機会があったので話のネタにしようと.…身バレしそうやけどこんな場末ブログ誰も見とらんやろ

以下のような3本しかbarが出てないので間隔が広いのがどうにかならんかと言われたとします.


こういう時は私はxaxisステートメントのoffsetmin/maxで調整しています.ほかにいい方法があるかもしれませんが.今回だとoffsetmin = 0.3    offsetmax = 0.3 くらいを指定すると以下の図になり多少は棒の間隔がマシになります.今回は0.4まで広げると個人的に見た目がイマイチだったので0.3か0.35くらいですかね.正直間隔が広くてもええやろって思うのですがなかなか許してもらえない


この状態で棒の幅をvbarステートメントでbarwidth = 1.0を指定すると,以下の感じに棒の
間隔そのものがなくなります.offsetmin/maxである程度見た目整えて,微調整をbarwidthでやるようにしています.初めて棒くっつけろ言われた時はどうしようか悩んだのが懐かしいですね.頼むから余計なリクエスト言わんでくれ…


2021年6月10日木曜日

特定文字のunicodeが知りたい話

 βとかαなどギリシア文字に半角用フォントを充てるときや,≧や③といった文字を出力するときにunicodeを直接指定するときがあると思います.βなら^{unicode 2265}だったりする4文字のやつですね.毎度unicodeを検索しなくてもunicodec関数を使用すればsasである程度は表示できるので,その関数の紹介です.

例えば以下の実行結果ですが,上で取り上げたβと≧のunicodeをlogに出しています.

131    data _null_ ;
132      str1 = unicodec("β" ) ;
133      str2 = unicodec("≧" ) ;
134      putlog "β:" str1 "≧:" str2 ;
135    run ;

NOTE: DATAステートメント処理(合計処理時間):
      処理時間           0.00 秒
      CPU時間            0.00 秒

β:\u03B2 ≧:\u2267

他にも③だと以下の通りです.

136    data _null_ ;
137      str1 = unicodec("③" ) ;
138      putlog "③:" str1 ;
139    run ;

NOTE: DATAステートメント処理(合計処理時間):
      処理時間           0.00 秒
      CPU時間            0.00 秒

③:\u2462

分からなくて毎回調べるのが大変だったのでユニコードを出力できるこのunicodec関数は結構助かっています.sasのhelpを見ると「This function reads characters that are in the current SAS session encoding and converts them to Unicode encoding.」とあるので,現在のsasのセッションエンコーディングの文字を読み取って,unicodeに変換する関数のようです.なのでsjisの環境だと上付きの数字などのunicodeを出せないのが残念でならないです…上付きの数字は結構使うので惜しいところです.unicode環境で上付き文字を指定するとunicodeは出せると思います.試してないですが.

ちなみにunocodec関数には第二引数があり出力時のエスケープ文字を変えれるのですが,今回のようなユニコードを調べるだけならデフォルトのままで不都合がないのでそのままにしています.例えば第二引数に"paren"と指定すると<03B2>のようにカッコくくりになります

2021年6月9日水曜日

sas発表会に参加した

 前回延期したのが2020年1月末,実にそこから一年強空いたがsasの発表会に参加した.昨今の情勢もありオンライン開催となったが,会場を提供してくださった方に多大な感謝を.

今回の私の発表はswimmerplotについて…こいついつもグラフ描いてんな,なんてことは言ってはいけない.最近は闇の勢力によってexcelでKM曲線出せだの,excelでforestplot出せだの摩訶不思議なworldに足を踏み入れている.地獄か?最近はやりのspotfire君は早く私を助けてくれ.excelでKM曲線書くときのヒゲをどうするかと言う偉大な問題は人力で解決したが,設定で出せるやろVS設定考えてる暇あったら人力でやってしまえ,どうせこんな話二度とこない.の葛藤の末のことだった.何とか良い感じに処理できるように工夫したいところ.

今回の発表会も奇々怪々,いや失敬,多様な内容だった.複数のグラフを1枚のwordに並べるときによくわからない事象が起きるのはどこも共通のようだった.あと野球のシミュレーションの話がなかなか面白そう.ああいうの見るとちょっとやりたくなりますなります.

次回開催は未定.ユーザー会が秋なので冬にするか,いっそ夏にするか,夏だと発表の準備が間に合わんから冬だったらうれしいなって思う.

2021年のsasユーザー会のアブストの締め切りが7月にあるが,正直気づいてなかったし今年の私の予定がやべーので多分間に合わない.あきらめの境地である.オンライン開催なら有給で潜り込んでもバレへんかな…などと考えているが,やっぱり今年も申請して参加するのだろう.予定が合えばだが.

最後に共有フォルダの設定がポンコツなのは修正しますので少しお待ちください…すみません…

2021年3月9日火曜日

データセットを2回転置する話

 大したことない内容なのでタイトルをどうするかにすごく悩んでしまいました.

sasで集計した時,以下のように1群1obsのデータセットが出来たとします.ARM1の時の数と割合が横に持っていて,同じようにARM2の時が縦に積まれているような状態ですね.これをARM1の数と割合,ARM2の数と割合をそれぞれ同じobsに別の変数として持ちたい時がありますか?ありますよね?そう,あるんですよ

要は2obs3変数(群,数,割合)のデータセットを,1obs5変数(群,群1の数,群1の割合,群2の数,群2の割合)に変換すると言うことです.群1と2の数を転置して横持ち,群1と2の割合を転置して横持ち,最後にそれぞれのデータセットをmergeして1obs5変数のデータセットを作っているプログラムを見て,多分転置2回した方が早いんじゃないか...?と思ったのでここに供養します.


data hoge ;
  ARM = 1 ; COUNT = "1" ; PERCENT = "10%" ; KEY = 1 ; output ;
  ARM = 2 ; COUNT = "2" ; PERCENT = "20%" ; KEY = 1 ; output ;
run ;

proc sort data = hoge;
    by KEY ARM ;
run;

proc transpose data = hoge out = __hoge ;
    by KEY ARM ;
    var COUNT PERCENT ;
run;

proc transpose data = __hoge out = OUT ;
    by KEY;
    id _NAME_ ARM ;
    var COL1 ;
run;

これを実行すると,ARM KEY COUNT1 PERCENT1 COUNT2 PERCENT2の1obsが得られます.KEYの持たせ方を変えれば縦に一部を詰むこともできるのでお試し下さい…

2021年2月1日月曜日

SAS9.4のM7が来てた

 気づかないもんですね…SAS9.4M7が2020年8月に来ていたようです.毎度言ってるんですけど,もうちょっと上手く自分がこの手の情報を拾いたいですね.たまたまでしか見かけたことが無い

sasのhelpのここにありました.メンテナンスリリースによるSAS9.4の拡張って章です.新しい関数やプロシジャと言うよりは調整が主ですかね.一番の見どころはやはりflash関連でしょうか
以下の記載の通りflashの対応したそうですね,M6までの分はflashが終わってから影響ないのか不安ではありますが,まあ1ユーザにはお祈りしかできること無いですね.南無南無

--ここから引用
SAS 9.4M7では、SASオファリングからAdobe Flashの依存関係を取り除くための数年にわたる取り組みが完了しました。Adobe社は、Flashテクノロジのサポートを終了し、2020年末にはFlash Playerの更新と配布を停止すると発表しました。ブラウザベンダは、2019年にデフォルトでFlashを無効にしました。Adobe Flashのサポート終了の詳細については、SASソフトウェアとAdobe Flash Playerの使用についてを参照してください。
--ここまで引用

あとは既知の内容の修正が多いですね.見始めるときりが無いので取り上げませんが,一覧は上がっています.まあメンテナンスリリースですし,新機能の追加よりこっちの方が主になるのが自然に思えます

私がM7を使えるようになるのはいつだろうか…


2021年1月1日金曜日

連続した複数のブランクを1つに削る話

 たまにミスか知らないですけど1つで良いところに2つくらいスペースが入ってるときを見かけます.え?そんなに見ない?
連続した空白の重複を取り除くのって知人のプログラムでは大層なことをやっていたのですが,関数一発で片付くのです…もちろん配列とか駆使すれば何とかなりますけど…

以下の実行ログを見てもらえればいいのですが,compbl関数の紹介です.
aの変数にはhoとgeの間にスペースが3つはいっていますが,compbl関数を通したbの変数ではスペースが1つになっています.あんまり使う機会無いのでいっつも使いたい時には忘れているのですが…
スペースは何個あっても1つになります.スペース自体を消す時はcompress関数ですね

79129   data _null_ ;

79130   a = "ho   ge" ;
79131   b = compbl(a) ;
79132
79133   putlog a b ;
79134   run ;

ho   ge ho ge

NOTE: DATAステートメント処理(合計処理時間):
      処理時間           0.00 秒
      CPU時間            0.00 秒