新手,互相交流。
我的思路是:1.将数据集转置;2.将payment中字符变量转化为数值变量,方便求和计算;3.用sql得到想要的变量;4.再和最初数据集merge到一起。
data pay;
input acct $ pay1 $ pay2 $ pay3 $ pay4 $ pay5 $ pay6 $;
datalines;
jim M F M G N M
sam F F G G N M
smith M G F F M N
;
RUN;
proc sort data=pay;
by acct;
run;
proc transpose data=pay out=pay_tran;
by acct;
var pay1-pay6;
run;
data pay_tran;
set pay_tran;
if col1='M' then payn=1;
else payn=0;
run;
proc sql;
create table aa as
select acct as acct, sum(payn) as mm
from pay_tran
group by acct;
quit;
proc sort data=pay;
by acct;
run;
proc sort data=aa;
by acct;
run;
data final;
merge pay aa;
by acct;
run;
data pay;
input acct $ pay1 $ pay2 $ pay3 $ pay4 $ pay5 $ pay6 $;
datalines;
jim M F M G N M
sam F F G G N M
smith M G F F M N
;
RUN;
proc sort data=pay;
by acct;
run;
proc transpose data=pay out=pay_tran;
by acct;
var pay1-pay6;
run;
data pay_tran;
set pay_tran;
if col1='M' then payn=1;
else payn=0;
run;
proc sql;
create table aa as
select acct as acct, sum(payn) as mm
from pay_tran
group by acct;
quit;
proc sort data=pay;
by acct;
run;
proc sort data=aa;
by acct;
run;
data final;
merge pay aa;
by acct;
run;
data test;
input acct payment1 payment1 payment2 payment3 payment3 payment4 payment5 payment5 payment6 $;
count=(payment1="M")+(payment2="M")+(payment3="M")+(payment4="M")+(payment5="M")+(payment6="M");
cards;
jim M F M G N M
sam F F G G N M
Smith M G F F M N
;
run;
data pay;
input acct $ pay1 $ pay2 $ pay3 $ pay4 $ pay5 $ pay6 $;
datalines;
jim M F M G N M
sam F F G G N M
smith M G F F M N
;
RUN;
data a;
set pay;
flag=0;
array pay(6) pay1-pay6;
retain flag;
do i=1 to 6;
if find(pay(i),'M') then do;
flag+1;
end;
end;
run;