data test;
input F1 F2 F3 F4 M $;
cards;
0 1 0 1 A
1 0 0 0 A
3 8 0 2 A
4 0 9 2 A
0 0 0 4 B
3 2 1 4 B
9 0 7 1 B
;
proc sort data=test;
by m;
run;
proc transpose data=test out=test1;
by m;
var f1-f4;
run;
data test2;
set test1;
array num[*] col:;
bign=0;
smalln=0;
do i=1 to dim(num);
if num[i] ne . then bign=bign+1;
if num[i] not in(.,0) then smalln=smalln+1;
end;
n=strip(put(smalln,best.));
pct=strip(put((smalln/bign*100),4.))||'%';
keep m _name_ n pct;
run;
proc sort data=test2;
by _name_;
run;
data test3;
merge test2(where=(m='A') rename=(n=na pct=pcta))
test2(where=(m='B') rename=(n=nb pct=pctb));
by _name_;
drop m;
run;
data test4;
set test3(keep=_name_ na nb rename=(na=a nb=b))
test3(keep=_name_ pcta pctb rename=(pcta=a pctb=b));
by _name_;
if last._name_ then call missing(_name_);
run;