ひたすら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 |