2013年12月2日月曜日

色々な例数を簡単に出す。



「SQLプロシジャでフラグ変数を簡単に作成。」を発展させたやり方。


A薬投与例数、B薬投与例数、中止例数、、etc
色々な例数をカウントしたい場合、SQLなら1STEPで簡単に出来てしまう。

サンプルデータ
data DT1;
  attrib
     SUBJID   label="症例番号"       length=$3.
     ARM       label="群"                 length=$10.
     SEX        label="性別"              length=$1.
     AEYN      label="有害事象有無" length=$1.
  ;
  input SUBJID$ ARM$ SEX$ AEYN$ ;
cards;
001 A薬 M  Y
002 B薬 F  Y
003 A薬 F  N
004 A薬 M  Y
005 B薬 F  N
;
run;


求めたい結果



SQLプロシジャで各例数を計算
proc sql;
   create table DT2 as
   select sum(ARM="A薬")  as N_ARM1, 
             sum(ARM="B薬")  as N_ARM2
   from DT1;
quit;


解説
関数の中に条件式を入れてるとこがポイント。

仕組みはまず、条件式に合致する場合「true=1」
合致しない場合「false=0」が返される。
その「0」か「1」になった値をsum関数で合計することで、条件に合致する例数をカウントしたことになる。

ちなみによくやる間違えとして、sum関数じゃなくcount関数を使ってしまいがち。
count関数は非欠損値の数をカウントするので、「0」も「1」もカウントしちゃって意味のない処理になっちゃうので注意。



応用
グループ毎に色々な有無を出すこともできる。

たとえば、上記で作成したサンプルデータで以下のように「群毎の有無」を出したいとする。
ちなみに「0=無」「1=有」を表す。






SQLプロシジャで群毎の各有無を出す。
proc sql;
   create table DT3 as
   select ARM,
          max(AEYN="Y")  as AEYN,
          max(SEX="M" and AEYN="Y")  as MALEYN
   from DT1
   group by ARM;
quit;



解説
条件式が「1=true」「0=false」となることを利用し、
「max(条件式)」とすることで「0=無」「1=有」という感じで、有無を得ることが出来てしまう。


SQLの素晴らしい柔軟さが伺える。

0 件のコメント:

コメントを投稿