I want to know whether these obs is populated in the dataset randomly? there some obs maybe at the end of dataset . look like: Pair1 Pair2 1 2 1 3 5 6 2 4 If it were so. I have coded it for a user ------- sas_Forum. http://communities.sas.com/message/104261#104261 For Art297. I found the link is not available any more . Why ? because sas_Forum has deleted it? Fortunately I have a copy. The following code is an example for your question. data test;
input ( pan1 pan2 pan3 add1 ) ($);
datalines;
aaa bbb ccc ddd
. . . .
qqq rrr www aaa
rrr ppp mmm lll
uuu zzz ffff ppp
p l m n
. . . .
. . . .
jjjj eee rrr ooo
sss www . .
. . . eee
;
run;
options compress=yes;
data want(keep=pan1 pan2 pan3 add1 household);
/*to make speed faster*/
declare hash ha(hashexp : 20,ordered : 'a');
declare hiter hi('ha');
ha.definekey('count');
ha.definedata('count','pan1','pan2','pan3','add1');
ha.definedone();
declare hash _ha(hashexp: 20,ordered : 'a');
_ha.definekey('key');
_ha.definedone();
do until(last);
set test end=last;
/*Remove obs which variable's are all missing firstly*/
if cmiss(pan1,pan2,pan3,add1) lt 4 then do;
count+1;
ha.add();
end;
end;
length key $ 40;
array h{4} $ 40 pan1 pan2 pan3 add1;
/*copy the first obs from Hash Table HA into PDV*/
_rc=hi.first();
do while(_rc eq 0); *until the end of Hash Table HA;
/*assign a unique cluster flag(i.e. household)*/
household+1;
do i=1 to 4;
/*push not missing value of current obs into another Hash Table _HA*/
if not missing(h{i}) then do; key=h{i}; _ha.replace();end;
end;
/*start to run over Hash Table HA ,until can not find any more
observation which is the same cluster with current observation*/
do until(x=1);
x=1;
/*copy the first obs from Hash Table HA into PDV*/
rc=hi.first();
do while(rc=0);
found=0;
do j=1 to 4;
/*find whether any one of value is included in the current obs*/
key=h{j};rcc=_ha.check();
if rcc =0 then found=1;
end;
if found then do;
/*if any one of value is included,then push the obs which is copied from
Hash Table HA into Hash Tables _HA,flag it the same cluster with the
current obs and output it into dataset*/
do k=1 to 4;
if not missing(h{k}) then do; key=h{k};_ha.replace();end;
end;
output;x=0; _count=count;*keep this found obs's index;
end;
rc=hi.next();
/*remove the found obs from Hash Table HA,since it has been seared*/
if found then rx=ha.remove(key : _count);
end;
end;
/*clear up all the index which is the same cluster with the current obs*/
_ha.clear();
/*copy the first obs from Hash Table HA into PDV*/
_rc=hi.first();
end;
run;
Ksharp
... View more