proc sort data=your_data(keep=v1) out=var1_data;
by v1;
run;
data report_data;
set var1_data;
by v1;
retain sum maxfreq;
if _n_=1 then maxfreq=0;
if first.v1 then sum=0;
sum=sum+1;
if last.v1 then do;
if sum>maxfreq then maxfreq=sum;
end;
call symput('maxfreq',maxfreq);
run;
data result_report;
set report_data;
if sum=&maxfreq;
keep v1 maxfreq;
run;
proc sort data=your_data out=var_data;
by v1 v2;
run;
data report_data;
set var_data;
by v1 v2;
retain sum maxfreq;
first_num=0; last_num=0;
if first.v1 or first.v2 then first_num=1;
if last.v1 or last.v2 then last_num=1;
if _n_=1 then maxfreq=0;
if first_num=1 then sum=0;
sum=sum+1;
if last_num=1 then do;
if sum>maxfreq then maxfreq=sum;
end;
call symput('maxfreq',maxfreq);
run;
data result_report;
set report_data;
if sum=&maxfreq;
keep v1 v2 maxfreq;
run;
非常的感谢!
我的是5个变量,是不是就改动:
if first.v1 or first.v2 or first.v3 or first.v4 or first.v5 then first_num=1;
以及其它出现v1 v2 的地方就可以了?
请原谅我对sas的无知,衷心感谢你!
如果我除了要找出最大的组合及其频数,还要找出第2、第3的频数及其次数,需要调整哪个地方呢?
proc sort data=your_data out=var_data;
by v1 v2;
run;
data report_data;
set var_data;
by v1 v2;
retain sum;
first_num=0; last_num=0;
if first.v1 or first.v2 then first_num=1;
if last.v1 or last.v2 then last_num=1;
if first_num=1 then sum=0;
sum=sum+1;
if last_num=1;
run;
proc sort data=report_data(keep=v1 v2 sum) out=report_data;
by descending sum;
run;
我不清楚你的频数考不考虑顺序,
比如
a b c d e
1 2 3 4 5
5 4 3 2 1
这两行是否是同一个组合?
如果是,参考这段:
proc datasets lib=work nodetails nolist;delete out;run;
data a;
input a b c d e;
cards;
1 2 3 4 5
3 4 5 6 1
1 3 4 5 6
1 3 4 5 1
5 4 3 2 1
;
data _null_;
set a end=eof;
if eof then call symput('n',left(_n_));
run;
data out;run;
%macro loop();
%do i=1 %to &n;
data out&i;
set a;
if _n_=&i;
run;
proc transpose data=out&i out=out&i(drop=_label_ _name_);
var _numeric_;
run;
proc sort data=out&i out=out&i;by col1;run;
proc transpose data=out&i out=out&i;
var col1;
run;
data out;
set out out&i;
drop _name_;
run;
%end;
data out;set out;if _n_^=1;run;
%mend;
%loop();
data t;
set out;
x=catx(',',col1,col2,col3,col4,col5);
run;
proc sql;select distinct x,count(*) as num from t group by x order by calculated num desc;quit;
如果不是,前面的loop都不需要了,直接从catx那步做起。