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 秒


2020年12月1日火曜日

PharmaSUG2020 TOKYOに参加した話

 昨年参加してからもう1年がたったことに驚きだが今年もPharmaSUGに参加した.今年はコロナもあってオンライン開催.昨年は前日に東京に入って準備やらしたのが懐かしい.家にいると気楽なのはいいのだが「ピンポーン」と誰か来るのはもはやご愛敬.残念午前はQAを見ないといけなかったので呼び出しに応じることはできず客は去っていった.用があるならまた来るやろ.準備にかこつけて普段会えない方と集まるのはいい機会ではあったのだがこんなご時世なので致し方ない.いややっぱり大都会東京のオサレお店でご飯食べたかった.大いに残念である.こんな時くらいしか東京行かないのに.

今年の演題はコロナコロナ&covid19とこんなご時世なのはPharmaSUGの内容にも及んでいる.せっかくの機会で諸々のプロセスを見直したりとか,伝播の状況を可視化したりとかなかなか面白い発表がたくさんだった.いやなにかわかったようなことを書いてしまったが英語パワーが足りないのは昨年と同じで,内容が全然サッパリと言う所が多かった.後で資料見てこんなんやったっけ?となることもしばしばである.
オンラインでの研修はあまり参加したことがなかったので色々難しいことがあったが,まあ無事終わってやれやれ.もしこの他にオンライン開催のイベントがあれば,参加してどういう運営をしているのかを見てみたい.せっかくのコロナと言う機会なのでいろんな開催形態を知っていきたいところ.オンラインと現地の両方で開催,なんてことが普通になるとド田舎の私にとっては,非常に参加の機会が広がって良いなと思うこの頃である.

2020年10月1日木曜日

マクロ変数が空であるかを条件にして分岐させる話

マクロ変数が空かそうでないかでプログラムを分岐できませんか?って聞かれました. ちょっと具体的な状況がピンとこないところですが,とりあえず分岐だけはしたのでここに供養します.
最近sasを触らずsuper excel おじさんになっていたので良い気分転換です.

分岐の時にマクロ変数を空白と比較してあげると空かどうかの判定に使えます.以下で言う所の %if &test = %then %do ; ですね. 以下のプログラムでマクロ変数 testが空の時は空とログに出してくれますし,そうじゃない時はからじゃないよってログに出してくれます.
そう言えば近頃のsasでは%ifが平文で使えるので,いちいちマクロを定義して実行って形にしなくて良く見やすいプログラムがかけますね.

option mprint;
%let test=;
%if &test = %then %do ;
data _null_ ;
  putlog "マクロ変数が空です" ;
run ;
%end ;

%if &test ^= %then %do ;
data _null_ ;
  putlog "マクロ変数が空じゃありません" ;
run ;
%end ;
option nomprint ;

実行ログは以下の通りです.マクロ変数が空なことを示すメッセージのみがログに出ています.
460 option mprint;
461 %let test=;
462
463 %if &test = %then %do ;
464 data _null_ ;
465 putlog "マクロ変数が空です" ;
466 run ;
 マクロ変数が空です
NOTE: DATAステートメント処理(合計処理時間): 処理時間 0.00 秒 CPU時間 0.00 秒
467 %end ;
468
469 %if &test ^= %then %do ;
470 data _null_ ;
471 putlog "マクロ変数が空じゃありません" ;
472 run ;
473 %end ;
474
475 option nomprint ;

このマクロ変数の戻り値に半角スペースって昔は通らなかったんですよね…いつか忘れましたが気づいたら通るようになっていました.便利になったもんです. 通らなかった時はマクロ変数をlength関数に入れて,戻り値が0だったらマクロ変数は空とする.みたいに書いていました.

2020年9月1日火曜日

32bit環境で作ったsasのformatを64bit環境にに移送する話

32bit環境で作ったSASのforamtはそのままだと64bit環境では使えません.データセットは互換あるのですが...使えないでは困る場面があるので移行する方法を紹介します.エンコードとかがすごーくややこしそうな局面と思えるのですが,今回は扱いません.

32bit環境で移行用のファイルを作成し,64bit環境で移行用ファイルを解凍します.移行には32bit環境での準備が要るっぽいので,format含めて移行が必要な場合は早めに準備しておいた方が良さそうですね...たまにcptファイルでデータを頂くことがあるので,その場合は以下の新環境で実行するプログラムを実行するとokです

エンコードの話とか怖くて触れたくない,出会いたくもない.ややこしいのが来ないよう日々祈るばかり.マジで勘弁してくれ

/*>>>>>---------- ここから旧環境で実行 ----------<<<<<*/
LIBNAME CAT32 "移行したいsasデータセットとsasのformatファイルのパス";
filename FILE64 '移行用ファイルを保存するパス\移行用ファイル名.cpt';

proc cport lib=CAT32 file=FILE64 ;
run ;

/*>>>>>---------- ここから新環境で実行 ----------<<<<<*/
libname CAT64 "移行後のデータセットを保存したいパス" ;
filename FILE64 "移行用ファイルを保存するパス\移行用ファイル名.cpt" ;

proc cimport lib = CAT64 file = FILE64 ;
run ;