Did you try my code ?
https://communities.sas.com/t5/SAS-Communities-Library/How-to-find-all-connected-components-in-a-graph/ta-p/231539
Note: This two variables must have the same length.
data mydata;
length person_id $ 9 family_id $ 9;
input person_id $ family_id $;
datalines;
person001 family001
person002 family001
person003 family001
person004 family001
person005 family001
person006 family001
person007 family001
person001 family002
person008 family002
person009 family002
person010 family002
person011 family002
person012 family002
person013 family002
person014 family002
person014 family003
person015 family003
person016 family003
person016 family004
person017 family004
person018 family004
person019 family004
person020 family004
person021 family005
person022 family005
person023 family005
person024 family006
;
run;
*Note:FROM and TO variable must have the same length ;
data have;
set mydata(rename=(family_id=from person_id=to));
run;
data full;
set have end=last;
if _n_ eq 1 then do;
declare hash h();
h.definekey('node');
h.definedata('node');
h.definedone();
end;
output;
node=from; h.replace();
from=to; to=node;
output;
node=from; h.replace();
if last then h.output(dataset:'node');
drop node;
run;
data want(keep=node household);
declare hash ha(ordered:'a');
declare hiter hi('ha');
ha.definekey('count');
ha.definedata('last');
ha.definedone();
declare hash _ha(hashexp: 20);
_ha.definekey('key');
_ha.definedone();
if 0 then set full;
declare hash from_to(dataset:'full(where=(from is not missing and to is not missing))',hashexp:20,multidata:'y');
from_to.definekey('from');
from_to.definedata('to');
from_to.definedone();
if 0 then set node;
declare hash no(dataset:'node');
declare hiter hi_no('no');
no.definekey('node');
no.definedata('node');
no.definedone();
do while(hi_no.next()=0);
household+1; output;
count=1;
key=node;_ha.add();
last=node;ha.add();
rc=hi.first();
do while(rc=0);
from=last;rx=from_to.find();
do while(rx=0);
key=to;ry=_ha.check();
if ry ne 0 then do;
node=to;output;rr=no.remove(key:node);
key=to;_ha.add();
count+1;
last=to;ha.add();
end;
rx=from_to.find_next();
end;
rc=hi.next();
end;
ha.clear();_ha.clear();
end;
stop;
run;
node household
family001 1
person001 1
person002 1
person003 1
person004 1
person005 1
person006 1
person007 1
family002 1
person008 1
person009 1
person010 1
person011 1
person012 1
person013 1
person014 1
family003 1
person015 1
person016 1
family004 1
person017 1
person018 1
person019 1
person020 1
family005 2
person021 2
person022 2
person023 2
family006 3
person024 3
For your so large data, I would suggest to use batch mode,like:
"D:\SASHome\SASFoundation\9.4\sas.exe" -sysin "c:\temp\temp.sas" -log "c:\temp\temp.log" -memsize 0
"D:\SASHome\SASFoundation\9.4\sas.exe" -sysin "c:\temp\temp.sas" -log "c:\temp\temp.log" -memsize 20G
to maximize the SAS memory size.
... View more