めごめも!

ひとりと1匹の生活記録。

SASで割合データだけ取り出す

ひたすら0/1で並んでいるデータセットから割合だけ取り出したい場合どうしたらいいのか、うんうんうなって1週間。
どうもSQLみたい・・・。
趣旨としては、SASで、エクセルのCountif的なことをやりたかったわけです。
元のデータセット名はtest1

id a b c
1 0 1 1
2 0 1 1
3 0 1 1
4 0 0 1
5 0 0 1
6 1 0 1
7 1 0 1
8 1 0 1
9 1 0 0
10 1 0 0

ここから、aとbとc、それぞれ1だった人をカウントして、c=1だった人の中でa=1だった人の割合を出したいわけです。
で、出されるデータセット名はresult

proc sql;
create table result as
select
sum(a=1) as acount,
sum(b=1) as bcount,
sum(c=1) as ccount,
(sum(a=1)/sum(c=1))*100 as acpercent
from test1;
quit;

これができる

acount bcount ccount acpercent
1 5 3 8 62.5

横に長い1/0データから、割合を出したい。
分母が1じゃないと分子は絶対1にはならない。
分子/分母の割合を出したい。
そしてできることならこういう表が出したい。

分子が1の数 割合(分子/分母×100)
a
b

データセット名はtest2

要素A 要素B
id 分子a 分母a 分子b 分母b
1 0 1 1 1
2 1 1 1 1
3 1 1 0 1
4 0 1 0 0
5 0 1 0 0

まずは1回要素Aと要素Bごとのデータセットを作る。
で要素って項目を立てて、そこにaまたはbって名前が入るようにする(これ文字変数で入ったけど、最終的に割合出すとき文字で出てこなかったんだよな・・・)
sasの項目名って日本語使えないけど、面倒だからそのまま日本語で書くよ)

要素Aに関するデータセット(test2a)
data test2a;set test2;if 分母a=o then delete;要素=a;rename 分子a=分子 分母a=分母;run;

要素Bに関するデータセット(test2b)
data test2b;set test2;if 分母b=0 then delete;要素=b;rename 分子b=分子 分母b=分母;run;

これを縦につなげる(データセット名:test2all)
data test2all;set test2a test2b;run;

そうするとできるのがこういうやつ。

id 分子 分母 要素
1 0 1 a
2 1 1 a
3 1 1 a
4 0 1 a
5 0 1 a
1 1 1 b
2 1 1 b
3 0 1 b

これをそのままSQL構文でばばっとやります。

proc sql;
create table resultall as
select 要素,
sum(分子=1) as number,
(sum(分子=1))/(sum(分母=1))*100 as percent
from test2all
group by 要素;
quit;

要素 分子が1の数 割合(分子/分母×100)
a 2 40
b 2 66.6