data tmp1;
set raw end= eof;
m1_lag=lag(m1);
m2_lag=lag(m2);
retain group1 0;
if m1=m1_lag or m1=m2_lag or m2=m1_lag or m2=m2_lag then group1=group1;
else group1=group1+1;
run;
proc sort data=tmp1;
by m2 m1;
run;
data tmp2(drop=m1_lag m2_lag group1);
set tmp1 end= eof;
m1_lag=lag(m1);
m2_lag=lag(m2);
retain group2 0;
if m1=m1_lag or m1=m2_lag or m2=m1_lag or m2=m2_lag then group2=group2;
else group2=group2+1;
if group2 gt group1 then group2 = group1;
run;
[/code:1fol6ej8]作者: shiyiming 时间: 2010-2-9 11:12 标题: Re: 求助:Macro或者循环 非常感谢作者: shiyiming 时间: 2010-2-9 17:15 标题: Re: 求助:Macro或者循环 <!-- s:( --><img src="{SMILIES_PATH}/icon_sad.gif" alt=":(" title="Sad" /><!-- s:( -->作者: shiyiming 时间: 2010-2-9 23:55 标题: Re: 求助:Macro或者循环 Thanks Hopewell. Your codes works well generally, but when a pair has two memebers belonging to different groups, your codes cannot merge these two groups. For example, when you add one more pair, A03 & A07, they show up in two groups, how to merge them?
Thanks作者: shiyiming 时间: 2010-2-10 10:13 标题: Re: 求助:Macro或者循环 TO Tanzheng_MySAS:
proc sql;
create table temp1 as
select m,monotonic() as id
from (select m1 as m from raw union select m2 as m from raw);
create table temp2 as
select a.*,b.id as m1_id
from raw a left join temp1 b on a.m1=b.m;
create table final(drop=m1_id m2_id) as
select a.*,b.id as m2_id,ceil(mean(m1_id,m2_id)) as interval
from temp2 a left join temp1 b on a.m2=b.m
order by interval;
quit;
data final(keep=m1 m2 group);
set final;
length group $10;
retain flag 1;
lag_interval=lag(interval);
if _n_>1 then flag=ifn(interval-lag_interval>1,flag+1,flag);
group=cat("G",flag);
run;
It still has some problems with your code.I sent you a massenge. Please check.作者: shiyiming 时间: 2010-2-16 12:47 标题: Re: 求助:Macro或者循环 [code:306uwv4n]
data raw;
input m1 $ m2 $;
datalines;
A01 A02
A01 A03
A01 A04
A02 A03
A02 A04
A03 A04
A05 A07
A06 A07
A07 A08
A11 A13
A14 A15
A15 A16
A09 A10
A10 A11
A03 A07
A03 A15
;
proc sql;
create table group_list as
select m1 as m from raw
union
select m2 as m from raw;
quit;
data group_list;
set group_list end=eof;
id=_n_;
group=_n_;
if eof then call symputx('nobs',_n_);
run;
data final(drop=m rc);
length m $8;
if _n_ = 1 then do;
declare hash h(dataset:"group_list",hashexp:16);
h.defineKey('m');
h.defineData('id');
h.defineDone();
call missing(m,id);
end;
set raw;
rc=h.find(key:m1);
id1=id;
rc=h.find(key:m2);
rename id=id2;
run;
data _null_;
length m $8;
if _n_=1 then do;
declare hash h(dataset:"group_list",ordered:'yes',hashexp:16);
h.defineKey('id');
h.defineData('id','group','m');
h.defineDone();
call missing(id,group,m);
end;
set final end=eof;
rc=h.find(key:id2);
old_group_val=group;
rc=h.find(key:id1);
new_group_val=group;
do i=1 to &nobs;
rc=h.find(key:i);
if group=old_group_val then rc=h.replace(key:i,data:i,data:new_group_val,data:m);
end;
if eof then rc=h.output(dataset:'group_list');
run;
data final(keep=m1 m2 group);
retain m1 m2 group;
if _n_ = 1 then do;
declare hash h(dataset:"group_list",hashexp:16);
h.defineKey('id');
h.defineData('group');
h.defineDone();
call missing(id,group);
end;
set final;
rc=h.find(key:id1);
run;[/code:306uwv4n]