<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Re: comparing columns and creating new ones in SAS Programming</title>
    <link>https://communities.sas.com/t5/SAS-Programming/comparing-columns-and-creating-new-ones/m-p/13413#M1561</link>
    <description>I think your a little problem is very very complicated and very very tough!!!!!&lt;BR /&gt;
Hope somebody can post a more simple code ,Especial for data _null_;&lt;BR /&gt;
Where are you, @data _null_;????&lt;BR /&gt;
&lt;BR /&gt;
[pre]&lt;BR /&gt;
&lt;BR /&gt;
&lt;BR /&gt;
&lt;BR /&gt;
data temp(where=(boss is not missing));&lt;BR /&gt;
input boss $ sub $;&lt;BR /&gt;
cards;&lt;BR /&gt;
Jim Kate&lt;BR /&gt;
Lisa Jim&lt;BR /&gt;
Dave Lisa&lt;BR /&gt;
Dave Erik&lt;BR /&gt;
Anna Mary&lt;BR /&gt;
Anna Ben&lt;BR /&gt;
Erik Anna&lt;BR /&gt;
. Dave&lt;BR /&gt;
;&lt;BR /&gt;
run;&lt;BR /&gt;
&lt;BR /&gt;
proc sort data=temp;&lt;BR /&gt;
 by boss;&lt;BR /&gt;
run;&lt;BR /&gt;
&lt;BR /&gt;
data temp_unique temp_dup;&lt;BR /&gt;
 set temp;&lt;BR /&gt;
 by boss;&lt;BR /&gt;
 if first.boss then output temp_unique;&lt;BR /&gt;
  else output temp_dup;&lt;BR /&gt;
run;&lt;BR /&gt;
&lt;BR /&gt;
data want;&lt;BR /&gt;
 declare hash ha (hashexp:10);&lt;BR /&gt;
  ha.definekey('_boss');&lt;BR /&gt;
  ha.definedata('sub');&lt;BR /&gt;
  ha.definedone();&lt;BR /&gt;
&lt;BR /&gt;
 do until(last);&lt;BR /&gt;
  set temp_unique(rename=(boss=_boss)) end=last;&lt;BR /&gt;
  ha.add();&lt;BR /&gt;
 end;&lt;BR /&gt;
&lt;BR /&gt;
 do until(_last);&lt;BR /&gt;
  set temp_unique end=_last;&lt;BR /&gt;
   output;&lt;BR /&gt;
   _boss=boss;&lt;BR /&gt;
   do until(rc ne 0);&lt;BR /&gt;
    rc=ha.find();&lt;BR /&gt;
    if rc = 0 then output;&lt;BR /&gt;
    _boss=sub;&lt;BR /&gt;
   end;&lt;BR /&gt;
  end;&lt;BR /&gt;
drop _boss rc;&lt;BR /&gt;
run;&lt;BR /&gt;
    &lt;BR /&gt;
&lt;BR /&gt;
&lt;BR /&gt;
%macro loop;&lt;BR /&gt;
%let dsid=%sysfunc(open(temp_dup));&lt;BR /&gt;
%let nobs=%sysfunc(attrn(&amp;amp;dsid,nobs));&lt;BR /&gt;
%let dsid=%sysfunc(close(&amp;amp;dsid));&lt;BR /&gt;
%put nobs=&amp;amp;nobs; &lt;BR /&gt;
%do i=1 %to &amp;amp;nobs ;&lt;BR /&gt;
data single_obs;&lt;BR /&gt;
 set temp_dup;&lt;BR /&gt;
 if _n_ eq &amp;amp;i;&lt;BR /&gt;
run;&lt;BR /&gt;
&lt;BR /&gt;
data  temp_unique&amp;amp;i;&lt;BR /&gt;
 merge temp_unique single_obs;&lt;BR /&gt;
 by boss;&lt;BR /&gt;
run;&lt;BR /&gt;
&lt;BR /&gt;
data want&amp;amp;i;&lt;BR /&gt;
 declare hash ha (hashexp:10);&lt;BR /&gt;
  ha.definekey('_boss');&lt;BR /&gt;
  ha.definedata('sub');&lt;BR /&gt;
  ha.definedone();&lt;BR /&gt;
&lt;BR /&gt;
 do until(last);&lt;BR /&gt;
  set temp_unique&amp;amp;i(rename=(boss=_boss)) end=last;&lt;BR /&gt;
  ha.add();&lt;BR /&gt;
 end;&lt;BR /&gt;
&lt;BR /&gt;
 do until(_last);&lt;BR /&gt;
  set temp_unique&amp;amp;i end=_last;&lt;BR /&gt;
   output;&lt;BR /&gt;
   _boss=boss;&lt;BR /&gt;
   do until(rc ne 0);&lt;BR /&gt;
    rc=ha.find();&lt;BR /&gt;
    if rc = 0 then output;&lt;BR /&gt;
    _boss=sub;&lt;BR /&gt;
   end;&lt;BR /&gt;
  end;&lt;BR /&gt;
drop _boss rc;&lt;BR /&gt;
run;&lt;BR /&gt;
proc append base=want data=want&amp;amp;i force;&lt;BR /&gt;
run;&lt;BR /&gt;
%end;&lt;BR /&gt;
&lt;BR /&gt;
%mend loop;&lt;BR /&gt;
&lt;BR /&gt;
&lt;BR /&gt;
%loop&lt;BR /&gt;
&lt;BR /&gt;
%macro loopnext;&lt;BR /&gt;
%let dsid=%sysfunc(open(temp_unique));&lt;BR /&gt;
%let nobs=%sysfunc(attrn(&amp;amp;dsid,nobs));&lt;BR /&gt;
%let dsid=%sysfunc(close(&amp;amp;dsid));&lt;BR /&gt;
%put nobs=&amp;amp;nobs; &lt;BR /&gt;
%do i=1 %to &amp;amp;nobs ;&lt;BR /&gt;
data single_obs;&lt;BR /&gt;
 set temp_unique;&lt;BR /&gt;
 if _n_ eq &amp;amp;i;&lt;BR /&gt;
run;&lt;BR /&gt;
&lt;BR /&gt;
data  temp_dup&amp;amp;i;&lt;BR /&gt;
 merge temp_dup single_obs;&lt;BR /&gt;
 by boss;&lt;BR /&gt;
run;&lt;BR /&gt;
&lt;BR /&gt;
data want&amp;amp;i;&lt;BR /&gt;
 declare hash ha (hashexp:10);&lt;BR /&gt;
  ha.definekey('_boss');&lt;BR /&gt;
  ha.definedata('sub');&lt;BR /&gt;
  ha.definedone();&lt;BR /&gt;
&lt;BR /&gt;
 do until(last);&lt;BR /&gt;
  set temp_dup&amp;amp;i(rename=(boss=_boss)) end=last;&lt;BR /&gt;
  ha.add();&lt;BR /&gt;
 end;&lt;BR /&gt;
&lt;BR /&gt;
 do until(_last);&lt;BR /&gt;
  set temp_dup&amp;amp;i end=_last;&lt;BR /&gt;
   output;&lt;BR /&gt;
   _boss=boss;&lt;BR /&gt;
   do until(rc ne 0);&lt;BR /&gt;
    rc=ha.find();&lt;BR /&gt;
    if rc = 0 then output;&lt;BR /&gt;
    _boss=sub;&lt;BR /&gt;
   end;&lt;BR /&gt;
  end;&lt;BR /&gt;
drop _boss rc;&lt;BR /&gt;
run;&lt;BR /&gt;
proc append base=want data=want&amp;amp;i force;&lt;BR /&gt;
run;&lt;BR /&gt;
%end;&lt;BR /&gt;
&lt;BR /&gt;
%mend loopnext;&lt;BR /&gt;
&lt;BR /&gt;
%loopnext&lt;BR /&gt;
&lt;BR /&gt;
&lt;BR /&gt;
proc sort data=want out=final_want nodupkey;&lt;BR /&gt;
 by boss sub;&lt;BR /&gt;
run;&lt;BR /&gt;
&lt;BR /&gt;
&lt;BR /&gt;
&lt;BR /&gt;
&lt;BR /&gt;
 &lt;BR /&gt;
[/pre]&lt;BR /&gt;
&lt;BR /&gt;
&lt;BR /&gt;
Ksharp</description>
    <pubDate>Fri, 17 Jun 2011 10:48:14 GMT</pubDate>
    <dc:creator>Ksharp</dc:creator>
    <dc:date>2011-06-17T10:48:14Z</dc:date>
    <item>
      <title>comparing columns and creating new ones</title>
      <link>https://communities.sas.com/t5/SAS-Programming/comparing-columns-and-creating-new-ones/m-p/13411#M1559</link>
      <description>Hi all,&lt;BR /&gt;
&lt;BR /&gt;
I have a little problem, maybe you can help me. So I have a dataset for example like this:&lt;BR /&gt;
&lt;BR /&gt;
boss	sub&lt;BR /&gt;
Jim	Kate&lt;BR /&gt;
Lisa	Jim&lt;BR /&gt;
Dave	Lisa	&lt;BR /&gt;
Dave	Erik&lt;BR /&gt;
Anna	Mary&lt;BR /&gt;
Anna	Ben&lt;BR /&gt;
Erik	Anna&lt;BR /&gt;
.       Dave&lt;BR /&gt;
&lt;BR /&gt;
and I should list all of the subordinates for each boss.&lt;BR /&gt;
&lt;BR /&gt;
The table I would like to have shoud be something like this:&lt;BR /&gt;
	&lt;BR /&gt;
boss	sub1	sub2	sub3	sub4	sub5	sub6	sub7&lt;BR /&gt;
Jim	Kate&lt;BR /&gt;
Lisa	Jim	Kate	&lt;BR /&gt;
Dave	Lisa	Jim	Kate	Erik	Anna	Mary	Ben&lt;BR /&gt;
Anna	Mary	Ben&lt;BR /&gt;
Erik	Anna	Mary	Ben&lt;BR /&gt;
	&lt;BR /&gt;
Or even better like this:&lt;BR /&gt;
boss	sub&lt;BR /&gt;
Jim	Kate&lt;BR /&gt;
Lisa	Jim&lt;BR /&gt;
Lisa	Kate&lt;BR /&gt;
Dave	Lisa&lt;BR /&gt;
Dave	Jim&lt;BR /&gt;
Dave	Kate&lt;BR /&gt;
Dave	Erik&lt;BR /&gt;
Dave	Anna&lt;BR /&gt;
Dave	Mary&lt;BR /&gt;
Dave	Ben&lt;BR /&gt;
Anna	Mary&lt;BR /&gt;
Anna	Ben&lt;BR /&gt;
Erik	Anna&lt;BR /&gt;
Erik	Mary&lt;BR /&gt;
Erik	Ben&lt;BR /&gt;
&lt;BR /&gt;
Maybe this would be ok too:&lt;BR /&gt;
&lt;BR /&gt;
sub	boss1	boss2	boss3	boss4&lt;BR /&gt;
Kate	Jim	        Lisa	        Dave&lt;BR /&gt;
Jim	Lisa	        Dave&lt;BR /&gt;
Lisa	Dave&lt;BR /&gt;
Erik	Dave&lt;BR /&gt;
Mary	Anna	        Erik	        Dave&lt;BR /&gt;
Ben	Anna	        Erik	        Dave&lt;BR /&gt;
Dave&lt;BR /&gt;
&lt;BR /&gt;
Do you have any tips, how to do this? Naturally, I don't know in advance how many boss/subordinates the data includes.. Thanks for any help</description>
      <pubDate>Tue, 14 Jun 2011 17:44:23 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/comparing-columns-and-creating-new-ones/m-p/13411#M1559</guid>
      <dc:creator>RandomWalker</dc:creator>
      <dc:date>2011-06-14T17:44:23Z</dc:date>
    </item>
    <item>
      <title>Re: comparing columns and creating new ones</title>
      <link>https://communities.sas.com/t5/SAS-Programming/comparing-columns-and-creating-new-ones/m-p/13412#M1560</link>
      <description>Look at using SAS PROC TRANSPOSE in the SAS PROCEDURES documentation; also you will find much supplemental technical / conference reference material on the SAS.COM support website and likely in these forum archives.&lt;BR /&gt;
&lt;BR /&gt;
Scott Barry&lt;BR /&gt;
SBBWorks, Inc.</description>
      <pubDate>Tue, 14 Jun 2011 18:09:29 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/comparing-columns-and-creating-new-ones/m-p/13412#M1560</guid>
      <dc:creator>sbb</dc:creator>
      <dc:date>2011-06-14T18:09:29Z</dc:date>
    </item>
    <item>
      <title>Re: comparing columns and creating new ones</title>
      <link>https://communities.sas.com/t5/SAS-Programming/comparing-columns-and-creating-new-ones/m-p/13413#M1561</link>
      <description>I think your a little problem is very very complicated and very very tough!!!!!&lt;BR /&gt;
Hope somebody can post a more simple code ,Especial for data _null_;&lt;BR /&gt;
Where are you, @data _null_;????&lt;BR /&gt;
&lt;BR /&gt;
[pre]&lt;BR /&gt;
&lt;BR /&gt;
&lt;BR /&gt;
&lt;BR /&gt;
data temp(where=(boss is not missing));&lt;BR /&gt;
input boss $ sub $;&lt;BR /&gt;
cards;&lt;BR /&gt;
Jim Kate&lt;BR /&gt;
Lisa Jim&lt;BR /&gt;
Dave Lisa&lt;BR /&gt;
Dave Erik&lt;BR /&gt;
Anna Mary&lt;BR /&gt;
Anna Ben&lt;BR /&gt;
Erik Anna&lt;BR /&gt;
. Dave&lt;BR /&gt;
;&lt;BR /&gt;
run;&lt;BR /&gt;
&lt;BR /&gt;
proc sort data=temp;&lt;BR /&gt;
 by boss;&lt;BR /&gt;
run;&lt;BR /&gt;
&lt;BR /&gt;
data temp_unique temp_dup;&lt;BR /&gt;
 set temp;&lt;BR /&gt;
 by boss;&lt;BR /&gt;
 if first.boss then output temp_unique;&lt;BR /&gt;
  else output temp_dup;&lt;BR /&gt;
run;&lt;BR /&gt;
&lt;BR /&gt;
data want;&lt;BR /&gt;
 declare hash ha (hashexp:10);&lt;BR /&gt;
  ha.definekey('_boss');&lt;BR /&gt;
  ha.definedata('sub');&lt;BR /&gt;
  ha.definedone();&lt;BR /&gt;
&lt;BR /&gt;
 do until(last);&lt;BR /&gt;
  set temp_unique(rename=(boss=_boss)) end=last;&lt;BR /&gt;
  ha.add();&lt;BR /&gt;
 end;&lt;BR /&gt;
&lt;BR /&gt;
 do until(_last);&lt;BR /&gt;
  set temp_unique end=_last;&lt;BR /&gt;
   output;&lt;BR /&gt;
   _boss=boss;&lt;BR /&gt;
   do until(rc ne 0);&lt;BR /&gt;
    rc=ha.find();&lt;BR /&gt;
    if rc = 0 then output;&lt;BR /&gt;
    _boss=sub;&lt;BR /&gt;
   end;&lt;BR /&gt;
  end;&lt;BR /&gt;
drop _boss rc;&lt;BR /&gt;
run;&lt;BR /&gt;
    &lt;BR /&gt;
&lt;BR /&gt;
&lt;BR /&gt;
%macro loop;&lt;BR /&gt;
%let dsid=%sysfunc(open(temp_dup));&lt;BR /&gt;
%let nobs=%sysfunc(attrn(&amp;amp;dsid,nobs));&lt;BR /&gt;
%let dsid=%sysfunc(close(&amp;amp;dsid));&lt;BR /&gt;
%put nobs=&amp;amp;nobs; &lt;BR /&gt;
%do i=1 %to &amp;amp;nobs ;&lt;BR /&gt;
data single_obs;&lt;BR /&gt;
 set temp_dup;&lt;BR /&gt;
 if _n_ eq &amp;amp;i;&lt;BR /&gt;
run;&lt;BR /&gt;
&lt;BR /&gt;
data  temp_unique&amp;amp;i;&lt;BR /&gt;
 merge temp_unique single_obs;&lt;BR /&gt;
 by boss;&lt;BR /&gt;
run;&lt;BR /&gt;
&lt;BR /&gt;
data want&amp;amp;i;&lt;BR /&gt;
 declare hash ha (hashexp:10);&lt;BR /&gt;
  ha.definekey('_boss');&lt;BR /&gt;
  ha.definedata('sub');&lt;BR /&gt;
  ha.definedone();&lt;BR /&gt;
&lt;BR /&gt;
 do until(last);&lt;BR /&gt;
  set temp_unique&amp;amp;i(rename=(boss=_boss)) end=last;&lt;BR /&gt;
  ha.add();&lt;BR /&gt;
 end;&lt;BR /&gt;
&lt;BR /&gt;
 do until(_last);&lt;BR /&gt;
  set temp_unique&amp;amp;i end=_last;&lt;BR /&gt;
   output;&lt;BR /&gt;
   _boss=boss;&lt;BR /&gt;
   do until(rc ne 0);&lt;BR /&gt;
    rc=ha.find();&lt;BR /&gt;
    if rc = 0 then output;&lt;BR /&gt;
    _boss=sub;&lt;BR /&gt;
   end;&lt;BR /&gt;
  end;&lt;BR /&gt;
drop _boss rc;&lt;BR /&gt;
run;&lt;BR /&gt;
proc append base=want data=want&amp;amp;i force;&lt;BR /&gt;
run;&lt;BR /&gt;
%end;&lt;BR /&gt;
&lt;BR /&gt;
%mend loop;&lt;BR /&gt;
&lt;BR /&gt;
&lt;BR /&gt;
%loop&lt;BR /&gt;
&lt;BR /&gt;
%macro loopnext;&lt;BR /&gt;
%let dsid=%sysfunc(open(temp_unique));&lt;BR /&gt;
%let nobs=%sysfunc(attrn(&amp;amp;dsid,nobs));&lt;BR /&gt;
%let dsid=%sysfunc(close(&amp;amp;dsid));&lt;BR /&gt;
%put nobs=&amp;amp;nobs; &lt;BR /&gt;
%do i=1 %to &amp;amp;nobs ;&lt;BR /&gt;
data single_obs;&lt;BR /&gt;
 set temp_unique;&lt;BR /&gt;
 if _n_ eq &amp;amp;i;&lt;BR /&gt;
run;&lt;BR /&gt;
&lt;BR /&gt;
data  temp_dup&amp;amp;i;&lt;BR /&gt;
 merge temp_dup single_obs;&lt;BR /&gt;
 by boss;&lt;BR /&gt;
run;&lt;BR /&gt;
&lt;BR /&gt;
data want&amp;amp;i;&lt;BR /&gt;
 declare hash ha (hashexp:10);&lt;BR /&gt;
  ha.definekey('_boss');&lt;BR /&gt;
  ha.definedata('sub');&lt;BR /&gt;
  ha.definedone();&lt;BR /&gt;
&lt;BR /&gt;
 do until(last);&lt;BR /&gt;
  set temp_dup&amp;amp;i(rename=(boss=_boss)) end=last;&lt;BR /&gt;
  ha.add();&lt;BR /&gt;
 end;&lt;BR /&gt;
&lt;BR /&gt;
 do until(_last);&lt;BR /&gt;
  set temp_dup&amp;amp;i end=_last;&lt;BR /&gt;
   output;&lt;BR /&gt;
   _boss=boss;&lt;BR /&gt;
   do until(rc ne 0);&lt;BR /&gt;
    rc=ha.find();&lt;BR /&gt;
    if rc = 0 then output;&lt;BR /&gt;
    _boss=sub;&lt;BR /&gt;
   end;&lt;BR /&gt;
  end;&lt;BR /&gt;
drop _boss rc;&lt;BR /&gt;
run;&lt;BR /&gt;
proc append base=want data=want&amp;amp;i force;&lt;BR /&gt;
run;&lt;BR /&gt;
%end;&lt;BR /&gt;
&lt;BR /&gt;
%mend loopnext;&lt;BR /&gt;
&lt;BR /&gt;
%loopnext&lt;BR /&gt;
&lt;BR /&gt;
&lt;BR /&gt;
proc sort data=want out=final_want nodupkey;&lt;BR /&gt;
 by boss sub;&lt;BR /&gt;
run;&lt;BR /&gt;
&lt;BR /&gt;
&lt;BR /&gt;
&lt;BR /&gt;
&lt;BR /&gt;
 &lt;BR /&gt;
[/pre]&lt;BR /&gt;
&lt;BR /&gt;
&lt;BR /&gt;
Ksharp</description>
      <pubDate>Fri, 17 Jun 2011 10:48:14 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/comparing-columns-and-creating-new-ones/m-p/13413#M1561</guid>
      <dc:creator>Ksharp</dc:creator>
      <dc:date>2011-06-17T10:48:14Z</dc:date>
    </item>
    <item>
      <title>Re: comparing columns and creating new ones</title>
      <link>https://communities.sas.com/t5/SAS-Programming/comparing-columns-and-creating-new-ones/m-p/13414#M1562</link>
      <description>Hi can propose following:&lt;BR /&gt;
&lt;BR /&gt;
HTH,&lt;BR /&gt;
&lt;BR /&gt;
Eric&lt;BR /&gt;
&lt;BR /&gt;
---&lt;BR /&gt;
data hier;&lt;BR /&gt;
input boss: $32. sub:$32.;&lt;BR /&gt;
CARDS;&lt;BR /&gt;
Jim Kate&lt;BR /&gt;
Lisa Jim&lt;BR /&gt;
Dave Lisa &lt;BR /&gt;
Dave Erik&lt;BR /&gt;
Anna Mary&lt;BR /&gt;
Anna Ben&lt;BR /&gt;
Erik Anna&lt;BR /&gt;
;&lt;BR /&gt;
RUN;&lt;BR /&gt;
&lt;BR /&gt;
&lt;BR /&gt;
%macro recur();&lt;BR /&gt;
&lt;BR /&gt;
/* &lt;BR /&gt;
	we are speaking about recursive stuff so there will be issues if one boss has any (in)direct sub being his own boss!&lt;BR /&gt;
	one may add a maxIter argument&lt;BR /&gt;
*/&lt;BR /&gt;
%let lvl=1;&lt;BR /&gt;
proc sql;&lt;BR /&gt;
create table lvl1 as select * from hier order by sub;&lt;BR /&gt;
quit;&lt;BR /&gt;
&lt;BR /&gt;
proc sql noprint;&lt;BR /&gt;
select count(*) into:nsub &lt;BR /&gt;
from lvl&amp;amp;lvl. where sub ne '';&lt;BR /&gt;
quit;&lt;BR /&gt;
&lt;BR /&gt;
data all3;&lt;BR /&gt;
set lvl1(rename=(sub=sub1));&lt;BR /&gt;
run;&lt;BR /&gt;
&lt;BR /&gt;
data all2; set lvl1; run;&lt;BR /&gt;
&lt;BR /&gt;
%do %while(⊄ ne 0);&lt;BR /&gt;
	%let lvl=%eval(&amp;amp;lvl+1);&lt;BR /&gt;
	proc sql;&lt;BR /&gt;
	create table lvl&amp;amp;lvl. as&lt;BR /&gt;
	select distinct H.sub as boss, I.sub as sub&lt;BR /&gt;
	from lvl%eval(&amp;amp;lvl.-1) as H left join hier as I &lt;BR /&gt;
	on H.sub=i.boss&lt;BR /&gt;
	where H.sub ne '' &lt;BR /&gt;
		and H.sub ne i.sub /*careful then: do you have ID?*/ &lt;BR /&gt;
	order by h.sub;&lt;BR /&gt;
	quit; &lt;BR /&gt;
&lt;BR /&gt;
	proc sql noprint;&lt;BR /&gt;
	select count(*) into:nsub &lt;BR /&gt;
	from lvl&amp;amp;lvl. where sub ne '';&lt;BR /&gt;
	quit;&lt;BR /&gt;
&lt;BR /&gt;
	%if &amp;amp;nsub. ne 0 %then %do;	&lt;BR /&gt;
	proc sql; &lt;BR /&gt;
	create table all3 as &lt;BR /&gt;
	select * from all3 as a&lt;BR /&gt;
	left join lvl&amp;amp;lvl.(rename=(sub=sub&amp;amp;lvl.)) as b&lt;BR /&gt;
	on a.sub%eval(&amp;amp;lvl.-1)=b.boss;&lt;BR /&gt;
	quit;&lt;BR /&gt;
	proc append base=all2 data=all(where=(sub ne '') keep=boss sub&amp;amp;lvl. rename=(sub&amp;amp;lvl.=sub)); run;&lt;BR /&gt;
	proc sort data=all2 nodupkey; by boss sub; run;&lt;BR /&gt;
	%end;&lt;BR /&gt;
%end;&lt;BR /&gt;
	&lt;BR /&gt;
proc print data=all3; run;&lt;BR /&gt;
proc print data=all2; run;&lt;BR /&gt;
%mend;&lt;BR /&gt;
%recur();&lt;BR /&gt;
---</description>
      <pubDate>Fri, 17 Jun 2011 13:02:45 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/comparing-columns-and-creating-new-ones/m-p/13414#M1562</guid>
      <dc:creator>eric_lecoutre_businessdecision_com</dc:creator>
      <dc:date>2011-06-17T13:02:45Z</dc:date>
    </item>
    <item>
      <title>Re: comparing columns and creating new ones</title>
      <link>https://communities.sas.com/t5/SAS-Programming/comparing-columns-and-creating-new-ones/m-p/13415#M1563</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Given that the data don't include cycles, this is an elementary exercise of traversing a tree (or trees). It is a pity that we cannot pass (hash) object references to user-written functions. If it were possible, then I would have written the recursive part as a user-written function. Here, I use the link blocks instead. The link blocks allow recursive "calls" up to 10 or 11 deep by default. But this limit can be relaxed by using the stack= option to the data statement. (This option is now documented in 9.2.) You need to create and manage call stacks by yourself, though.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: #008000; font-family: Courier New; font-size: 9pt;"&gt;/* test data */&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;STRONG style="color: #000080; font-size: 9pt; font-family: Courier New;"&gt;data&lt;/STRONG&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt; one;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff; font-family: Courier New; font-size: 9pt;"&gt;input&lt;/SPAN&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt; boss $ sub $;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff; font-family: Courier New; font-size: 9pt;"&gt;cards&lt;/SPAN&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp; Jim Kate&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp; Lisa Jim&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp; Dave Lisa &lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp; Dave Erik&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp; Anna Mary&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp; Anna Ben&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp; Erik Anna&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp; . Dave&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp; Mary Tom&amp;nbsp;&amp;nbsp; &amp;lt;-- new data&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp; Mary Bill&amp;nbsp; &amp;lt;-- new data&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp; ;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;STRONG style="color: #000080; font-size: 9pt; font-family: Courier New;"&gt;run&lt;/STRONG&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;;&lt;/SPAN&gt;&lt;BR /&gt; &lt;BR /&gt; &lt;BR /&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: #008000; font-family: Courier New; font-size: 9pt;"&gt;/* find all the subs */&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff; font-family: Courier New; font-size: 9pt;"&gt;%let&lt;/SPAN&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt; maxDepth = 100;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;STRONG style="color: #000080; font-size: 9pt; font-family: Courier New;"&gt;data&lt;/STRONG&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt; &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff; font-family: Courier New; font-size: 9pt;"&gt;_null_&lt;/SPAN&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt; / stack=&amp;amp;maxDepth;&lt;/SPAN&gt;&lt;BR /&gt; &lt;BR /&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: #008000; font-family: Courier New; font-size: 9pt;"&gt;/* main */&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff; font-family: Courier New; font-size: 9pt;"&gt;link&lt;/SPAN&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt; setup;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff; font-family: Courier New; font-size: 9pt;"&gt;do&lt;/SPAN&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt; &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff; font-family: Courier New; font-size: 9pt;"&gt;until&lt;/SPAN&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt; (end);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff; font-family: Courier New; font-size: 9pt;"&gt;set&lt;/SPAN&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt; one end=end;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; thisBoss = boss;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff; font-family: Courier New; font-size: 9pt;"&gt;link&lt;/SPAN&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt; find;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff; font-family: Courier New; font-size: 9pt;"&gt;end&lt;/SPAN&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff; font-family: Courier New; font-size: 9pt;"&gt;link&lt;/SPAN&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt; out;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff; font-family: Courier New; font-size: 9pt;"&gt;return&lt;/SPAN&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;;&lt;/SPAN&gt;&lt;BR /&gt; &lt;BR /&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: #008000; font-family: Courier New; font-size: 9pt;"&gt;/* helpers */&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; setup:&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: #008000; font-family: Courier New; font-size: 9pt;"&gt;/* hashes */&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: #ff0000; font-family: Courier New; font-size: 9pt;"&gt;dcl&lt;/SPAN&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt; hash in(dataset:&lt;/SPAN&gt;&lt;SPAN style="color: #800080; font-family: Courier New; font-size: 9pt;"&gt;"work.one"&lt;/SPAN&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;, multidata:&lt;/SPAN&gt;&lt;SPAN style="color: #800080; font-family: Courier New; font-size: 9pt;"&gt;'y'&lt;/SPAN&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; in.definekey(&lt;/SPAN&gt;&lt;SPAN style="color: #800080; font-family: Courier New; font-size: 9pt;"&gt;'boss'&lt;/SPAN&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; in.definedata(&lt;/SPAN&gt;&lt;SPAN style="color: #800080; font-family: Courier New; font-size: 9pt;"&gt;'boss'&lt;/SPAN&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;,&lt;/SPAN&gt;&lt;SPAN style="color: #800080; font-family: Courier New; font-size: 9pt;"&gt;'sub'&lt;/SPAN&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;); &lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; in.definedone();&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: #ff0000; font-family: Courier New; font-size: 9pt;"&gt;dcl&lt;/SPAN&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt; hash out(ordered:&lt;/SPAN&gt;&lt;SPAN style="color: #800080; font-family: Courier New; font-size: 9pt;"&gt;'yes'&lt;/SPAN&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; out.definekey(&lt;/SPAN&gt;&lt;SPAN style="color: #800080; font-family: Courier New; font-size: 9pt;"&gt;'boss'&lt;/SPAN&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;,&lt;/SPAN&gt;&lt;SPAN style="color: #800080; font-family: Courier New; font-size: 9pt;"&gt;'sub'&lt;/SPAN&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; out.definedata(&lt;/SPAN&gt;&lt;SPAN style="color: #800080; font-family: Courier New; font-size: 9pt;"&gt;'boss'&lt;/SPAN&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;,&lt;/SPAN&gt;&lt;SPAN style="color: #800080; font-family: Courier New; font-size: 9pt;"&gt;'sub'&lt;/SPAN&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; out.definedone();&lt;/SPAN&gt;&lt;BR /&gt; &lt;BR /&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: #008000; font-family: Courier New; font-size: 9pt;"&gt;/* const and global vars */&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff; font-family: Courier New; font-size: 9pt;"&gt;retain&lt;/SPAN&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt; OK &lt;/SPAN&gt;&lt;STRONG style="color: #008080; font-size: 9pt; font-family: Courier New;"&gt;0&lt;/STRONG&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff; font-family: Courier New; font-size: 9pt;"&gt;length&lt;/SPAN&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt; thisBoss $&lt;/SPAN&gt;&lt;STRONG style="color: #008080; font-size: 9pt; font-family: Courier New;"&gt;8&lt;/STRONG&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;;&lt;/SPAN&gt;&lt;BR /&gt; &lt;BR /&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: #008000; font-family: Courier New; font-size: 9pt;"&gt;/* call stack */&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff; font-family: Courier New; font-size: 9pt;"&gt;array&lt;/SPAN&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt; stack_boss[&amp;amp;maxDepth] $&lt;/SPAN&gt;&lt;STRONG style="color: #008080; font-size: 9pt; font-family: Courier New;"&gt;8&lt;/STRONG&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt; &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff; font-family: Courier New; font-size: 9pt;"&gt;_temporary_&lt;/SPAN&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff; font-family: Courier New; font-size: 9pt;"&gt;array&lt;/SPAN&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt; stack_sub[&amp;amp;maxDepth] $&lt;/SPAN&gt;&lt;STRONG style="color: #008080; font-size: 9pt; font-family: Courier New;"&gt;8&lt;/STRONG&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt; &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff; font-family: Courier New; font-size: 9pt;"&gt;_temporary_&lt;/SPAN&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff; font-family: Courier New; font-size: 9pt;"&gt;array&lt;/SPAN&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt; stack_rc[&amp;amp;maxDepth] &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff; font-family: Courier New; font-size: 9pt;"&gt;_temporary_&lt;/SPAN&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff; font-family: Courier New; font-size: 9pt;"&gt;array&lt;/SPAN&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt; stack_i[&amp;amp;maxDepth] &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff; font-family: Courier New; font-size: 9pt;"&gt;_temporary_&lt;/SPAN&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff; font-family: Courier New; font-size: 9pt;"&gt;array&lt;/SPAN&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt; stack_j[&amp;amp;maxDepth] &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff; font-family: Courier New; font-size: 9pt;"&gt;_temporary_&lt;/SPAN&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; stack_top = &lt;/SPAN&gt;&lt;STRONG style="color: #008080; font-size: 9pt; font-family: Courier New;"&gt;0&lt;/STRONG&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff; font-family: Courier New; font-size: 9pt;"&gt;return&lt;/SPAN&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;;&lt;/SPAN&gt;&lt;BR /&gt; &lt;BR /&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; add:&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; out.add(key:thisboss, key:sub, data:thisboss, data:sub);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff; font-family: Courier New; font-size: 9pt;"&gt;return&lt;/SPAN&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;;&lt;/SPAN&gt;&lt;BR /&gt; &lt;BR /&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; find:&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff; font-family: Courier New; font-size: 9pt;"&gt;link&lt;/SPAN&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt; push;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff; font-family: Courier New; font-size: 9pt;"&gt;if&lt;/SPAN&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt; missing(thisboss) | missing(sub) &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff; font-family: Courier New; font-size: 9pt;"&gt;then&lt;/SPAN&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt; &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff; font-family: Courier New; font-size: 9pt;"&gt;goto&lt;/SPAN&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt; outoffind; &lt;/SPAN&gt;&lt;SPAN style="color: #008000; font-family: Courier New; font-size: 9pt;"&gt;/* no point adding */&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff; font-family: Courier New; font-size: 9pt;"&gt;if&lt;/SPAN&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt; out.check(key:thisBoss, key:sub)=OK &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff; font-family: Courier New; font-size: 9pt;"&gt;then&lt;/SPAN&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt; &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff; font-family: Courier New; font-size: 9pt;"&gt;goto&lt;/SPAN&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt; outoffind; &lt;/SPAN&gt;&lt;SPAN style="color: #008000; font-family: Courier New; font-size: 9pt;"&gt;/* already there*/&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff; font-family: Courier New; font-size: 9pt;"&gt;link&lt;/SPAN&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt; add;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: #008000; font-family: Courier New; font-size: 9pt;"&gt;/* follow */&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; boss = sub;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sub = &lt;/SPAN&gt;&lt;SPAN style="color: #800080; font-family: Courier New; font-size: 9pt;"&gt;''&lt;/SPAN&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: #008000; font-family: Courier New; font-size: 9pt;"&gt;/* find_next() gets reset as soon as another find() is called. &lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="color: #008000; font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; thus we have to call find() and the number of find_next() &lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="color: #008000; font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for each sibling here. &lt;span class="lia-unicode-emoji" title=":disappointed_face:"&gt;😞&lt;/span&gt; */&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff; font-family: Courier New; font-size: 9pt;"&gt;do&lt;/SPAN&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt; i = &lt;/SPAN&gt;&lt;STRONG style="color: #008080; font-size: 9pt; font-family: Courier New;"&gt;0&lt;/STRONG&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt; &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff; font-family: Courier New; font-size: 9pt;"&gt;by&lt;/SPAN&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt; &lt;/SPAN&gt;&lt;STRONG style="color: #008080; font-size: 9pt; font-family: Courier New;"&gt;1&lt;/STRONG&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt; &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff; font-family: Courier New; font-size: 9pt;"&gt;until&lt;/SPAN&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;(rc^=OK);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rc = in.find();&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff; font-family: Courier New; font-size: 9pt;"&gt;do&lt;/SPAN&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt; j = &lt;/SPAN&gt;&lt;STRONG style="color: #008080; font-size: 9pt; font-family: Courier New;"&gt;1&lt;/STRONG&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt; &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff; font-family: Courier New; font-size: 9pt;"&gt;to&lt;/SPAN&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt; i;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rc = in.find_next();&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff; font-family: Courier New; font-size: 9pt;"&gt;end&lt;/SPAN&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff; font-family: Courier New; font-size: 9pt;"&gt;if&lt;/SPAN&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt; rc = OK &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff; font-family: Courier New; font-size: 9pt;"&gt;then&lt;/SPAN&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt; &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff; font-family: Courier New; font-size: 9pt;"&gt;link&lt;/SPAN&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt; find;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff; font-family: Courier New; font-size: 9pt;"&gt;end&lt;/SPAN&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; outoffind: &lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff; font-family: Courier New; font-size: 9pt;"&gt;link&lt;/SPAN&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt; pop;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff; font-family: Courier New; font-size: 9pt;"&gt;return&lt;/SPAN&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;;&lt;/SPAN&gt;&lt;BR /&gt; &lt;BR /&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pop:&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; boss = stack_boss[top];&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sub = stack_sub[top];&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rc = stack_rc[top];&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; i = stack_i[top];&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; j = stack_j[top];&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; top + (-&lt;/SPAN&gt;&lt;STRONG style="color: #008080; font-size: 9pt; font-family: Courier New;"&gt;1&lt;/STRONG&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff; font-family: Courier New; font-size: 9pt;"&gt;return&lt;/SPAN&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;;&lt;/SPAN&gt;&lt;BR /&gt; &lt;BR /&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; push:&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; top + &lt;/SPAN&gt;&lt;STRONG style="color: #008080; font-size: 9pt; font-family: Courier New;"&gt;1&lt;/STRONG&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff; font-family: Courier New; font-size: 9pt;"&gt;if&lt;/SPAN&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt; top &amp;gt; &amp;amp;maxDepth &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff; font-family: Courier New; font-size: 9pt;"&gt;then&lt;/SPAN&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt; &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff; font-family: Courier New; font-size: 9pt;"&gt;do&lt;/SPAN&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;; &lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff; font-family: Courier New; font-size: 9pt;"&gt;put&lt;/SPAN&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt; &lt;/SPAN&gt;&lt;SPAN style="color: #800080; font-family: Courier New; font-size: 9pt;"&gt;"ERROR: stack overflow"&lt;/SPAN&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;; &lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff; font-family: Courier New; font-size: 9pt;"&gt;stop&lt;/SPAN&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;; &lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff; font-family: Courier New; font-size: 9pt;"&gt;end&lt;/SPAN&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; stack_boss[top] = boss;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; stack_sub[top] = sub;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; stack_rc[top] = rc; &lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; stack_i[top] = i;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; stack_j[top] = j;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff; font-family: Courier New; font-size: 9pt;"&gt;return&lt;/SPAN&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;;&lt;/SPAN&gt;&lt;BR /&gt; &lt;BR /&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; out:&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rc = out.output(dataset:&lt;/SPAN&gt;&lt;SPAN style="color: #800080; font-family: Courier New; font-size: 9pt;"&gt;"work.two"&lt;/SPAN&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff; font-family: Courier New; font-size: 9pt;"&gt;return&lt;/SPAN&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;STRONG style="color: #000080; font-size: 9pt; font-family: Courier New;"&gt;run&lt;/STRONG&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;;&lt;/SPAN&gt;&lt;BR /&gt; &lt;BR /&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: #008000; font-family: Courier New; font-size: 9pt;"&gt;/* check */&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;STRONG style="color: #000080; font-size: 9pt; font-family: Courier New;"&gt;proc&lt;/STRONG&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt; &lt;/SPAN&gt;&lt;STRONG style="color: #000080; font-size: 9pt; font-family: Courier New;"&gt;print&lt;/STRONG&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt; &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff; font-family: Courier New; font-size: 9pt;"&gt;data&lt;/SPAN&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;=two;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;STRONG style="color: #000080; font-size: 9pt; font-family: Courier New;"&gt;run&lt;/STRONG&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: #008000; font-family: Courier New; font-size: 9pt;"&gt;/* on lst&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="color: #008000; font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp; Obs&amp;nbsp;&amp;nbsp;&amp;nbsp; boss&amp;nbsp;&amp;nbsp;&amp;nbsp; sub&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="color: #008000; font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1&amp;nbsp;&amp;nbsp;&amp;nbsp; Anna&amp;nbsp;&amp;nbsp;&amp;nbsp; Ben&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="color: #008000; font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2&amp;nbsp;&amp;nbsp;&amp;nbsp; Anna&amp;nbsp;&amp;nbsp;&amp;nbsp; Bill&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="color: #008000; font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3&amp;nbsp;&amp;nbsp;&amp;nbsp; Anna&amp;nbsp;&amp;nbsp;&amp;nbsp; Mary&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="color: #008000; font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4&amp;nbsp;&amp;nbsp;&amp;nbsp; Anna&amp;nbsp;&amp;nbsp;&amp;nbsp; Tom&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="color: #008000; font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 5&amp;nbsp;&amp;nbsp;&amp;nbsp; Dave&amp;nbsp;&amp;nbsp;&amp;nbsp; Anna&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="color: #008000; font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 6&amp;nbsp;&amp;nbsp;&amp;nbsp; Dave&amp;nbsp;&amp;nbsp;&amp;nbsp; Ben&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="color: #008000; font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 7&amp;nbsp;&amp;nbsp;&amp;nbsp; Dave&amp;nbsp;&amp;nbsp;&amp;nbsp; Bill&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="color: #008000; font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 8&amp;nbsp;&amp;nbsp;&amp;nbsp; Dave&amp;nbsp;&amp;nbsp;&amp;nbsp; Erik&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="color: #008000; font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 9&amp;nbsp;&amp;nbsp;&amp;nbsp; Dave&amp;nbsp;&amp;nbsp;&amp;nbsp; Jim&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="color: #008000; font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 10&amp;nbsp;&amp;nbsp;&amp;nbsp; Dave&amp;nbsp;&amp;nbsp;&amp;nbsp; Kate&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="color: #008000; font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 11&amp;nbsp;&amp;nbsp;&amp;nbsp; Dave&amp;nbsp;&amp;nbsp;&amp;nbsp; Lisa&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="color: #008000; font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 12&amp;nbsp;&amp;nbsp;&amp;nbsp; Dave&amp;nbsp;&amp;nbsp;&amp;nbsp; Mary&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="color: #008000; font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 13&amp;nbsp;&amp;nbsp;&amp;nbsp; Dave&amp;nbsp;&amp;nbsp;&amp;nbsp; Tom&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="color: #008000; font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 14&amp;nbsp;&amp;nbsp;&amp;nbsp; Erik&amp;nbsp;&amp;nbsp;&amp;nbsp; Anna&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="color: #008000; font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 15&amp;nbsp;&amp;nbsp;&amp;nbsp; Erik&amp;nbsp;&amp;nbsp;&amp;nbsp; Ben&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="color: #008000; font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 16&amp;nbsp;&amp;nbsp;&amp;nbsp; Erik&amp;nbsp;&amp;nbsp;&amp;nbsp; Bill&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="color: #008000; font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 17&amp;nbsp;&amp;nbsp;&amp;nbsp; Erik&amp;nbsp;&amp;nbsp;&amp;nbsp; Mary&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="color: #008000; font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 18&amp;nbsp;&amp;nbsp;&amp;nbsp; Erik&amp;nbsp;&amp;nbsp;&amp;nbsp; Tom&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="color: #008000; font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 19&amp;nbsp;&amp;nbsp;&amp;nbsp; Jim&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Kate&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="color: #008000; font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 20&amp;nbsp;&amp;nbsp;&amp;nbsp; Lisa&amp;nbsp;&amp;nbsp;&amp;nbsp; Jim&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="color: #008000; font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 21&amp;nbsp;&amp;nbsp;&amp;nbsp; Lisa&amp;nbsp;&amp;nbsp;&amp;nbsp; Kate&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="color: #008000; font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 22&amp;nbsp;&amp;nbsp;&amp;nbsp; Mary&amp;nbsp;&amp;nbsp;&amp;nbsp; Bill&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="color: #008000; font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 23&amp;nbsp;&amp;nbsp;&amp;nbsp; Mary&amp;nbsp;&amp;nbsp;&amp;nbsp; Tom&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="color: #008000; font-family: Courier New; font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp; */&lt;/SPAN&gt;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 17 Jun 2011 20:39:10 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/comparing-columns-and-creating-new-ones/m-p/13415#M1563</guid>
      <dc:creator>chang_y_chung_hotmail_com</dc:creator>
      <dc:date>2011-06-17T20:39:10Z</dc:date>
    </item>
    <item>
      <title>Re: comparing columns and creating new ones</title>
      <link>https://communities.sas.com/t5/SAS-Programming/comparing-columns-and-creating-new-ones/m-p/13416#M1564</link>
      <description>Sorry.&lt;BR /&gt;
My code above is wrong.But I am still fight for it because I am very very interested with your problem.The following is correct code I believed !!!!!!!&lt;BR /&gt;
&lt;BR /&gt;
&lt;BR /&gt;
[pre]&lt;BR /&gt;
data temp(where=(boss is not missing));&lt;BR /&gt;
input boss $ sub $;&lt;BR /&gt;
cards;&lt;BR /&gt;
Jim Kate&lt;BR /&gt;
Lisa Anna&lt;BR /&gt;
Dave Lisa&lt;BR /&gt;
Dave Erik&lt;BR /&gt;
Dave Jim&lt;BR /&gt;
Dave Peter&lt;BR /&gt;
Anna Mary&lt;BR /&gt;
Anna Ben&lt;BR /&gt;
Anna Lisa&lt;BR /&gt;
Erik Anna&lt;BR /&gt;
Erik Dave&lt;BR /&gt;
. Dave&lt;BR /&gt;
;&lt;BR /&gt;
run;&lt;BR /&gt;
&lt;BR /&gt;
proc sort data=temp;&lt;BR /&gt;
 by boss;&lt;BR /&gt;
run;&lt;BR /&gt;
&lt;BR /&gt;
data temp_unique temp_dup;&lt;BR /&gt;
 set temp;&lt;BR /&gt;
 by boss;&lt;BR /&gt;
 if not(first.boss and last.boss) then output temp_dup;&lt;BR /&gt;
  else output temp_unique;&lt;BR /&gt;
run;&lt;BR /&gt;
data want;&lt;BR /&gt;
 declare hash ha (hashexp:10);&lt;BR /&gt;
  ha.definekey('_boss');&lt;BR /&gt;
  ha.definedata('sub');&lt;BR /&gt;
  ha.definedone();&lt;BR /&gt;
&lt;BR /&gt;
 do until(last);&lt;BR /&gt;
  set temp_unique(rename=(boss=_boss)) end=last;&lt;BR /&gt;
  ha.add();&lt;BR /&gt;
 end;&lt;BR /&gt;
&lt;BR /&gt;
 do until(_last);&lt;BR /&gt;
  set temp_unique end=_last;&lt;BR /&gt;
   output;&lt;BR /&gt;
   _boss=boss;&lt;BR /&gt;
   do until(rc ne 0 or count gt 10000); &lt;BR /&gt;
   /* 'count gt 10000' is to avoid dead loop ,Example: Dave-&amp;gt;Jim   Jim-&amp;gt;Dave*/&lt;BR /&gt;
    count+1;&lt;BR /&gt;
    rc=ha.find();&lt;BR /&gt;
    if rc = 0 then output;&lt;BR /&gt;
    _boss=sub;&lt;BR /&gt;
   end;&lt;BR /&gt;
  end;&lt;BR /&gt;
drop _boss rc;&lt;BR /&gt;
run;&lt;BR /&gt;
    &lt;BR /&gt;
&lt;BR /&gt;
&lt;BR /&gt;
options mprint;&lt;BR /&gt;
%macro all_comb;&lt;BR /&gt;
&lt;BR /&gt;
proc sort data=temp_dup;&lt;BR /&gt;
 by boss;&lt;BR /&gt;
run;&lt;BR /&gt;
data order;&lt;BR /&gt;
 set temp_dup;&lt;BR /&gt;
 by boss;&lt;BR /&gt;
 retain start;&lt;BR /&gt;
 if first.boss then start= _n_;&lt;BR /&gt;
 if last.boss then do; end= _n_; output; end;&lt;BR /&gt;
run;&lt;BR /&gt;
data _null_;&lt;BR /&gt;
 set order end=last;&lt;BR /&gt;
 call symputx(cats('do',_n_),'do '||boss||'='||strip(start)||' to '||strip(end)||' ;' );&lt;BR /&gt;
 call symputx(cats('set',_n_),'set temp_dup point='||boss||'; output;');&lt;BR /&gt;
 call symputx(cats('end',_n_),'end;');&lt;BR /&gt;
 if last then call symputx('nobs',_n_);&lt;BR /&gt;
run;&lt;BR /&gt;
&lt;BR /&gt;
/* To get all the combination of boss who has duplicated  value*/&lt;BR /&gt;
data comb;&lt;BR /&gt;
 %do i=1 %to &amp;amp;nobs;&lt;BR /&gt;
  &amp;amp;&amp;amp;do&amp;amp;i&lt;BR /&gt;
 %end;&lt;BR /&gt;
 count+1;&lt;BR /&gt;
 %do j=1 %to &amp;amp;nobs;&lt;BR /&gt;
  &amp;amp;&amp;amp;set&amp;amp;j&lt;BR /&gt;
 %end;&lt;BR /&gt;
 %do k=1 %to &amp;amp;nobs;&lt;BR /&gt;
  &amp;amp;&amp;amp;end&amp;amp;k&lt;BR /&gt;
 %end;&lt;BR /&gt;
stop;&lt;BR /&gt;
run;&lt;BR /&gt;
&lt;BR /&gt;
%mend all_comb;&lt;BR /&gt;
%all_comb&lt;BR /&gt;
data _null_;&lt;BR /&gt;
 set Comb end=last;&lt;BR /&gt;
 if last then  call symputx('count',count);&lt;BR /&gt;
run;&lt;BR /&gt;
%put _user_;&lt;BR /&gt;
&lt;BR /&gt;
%macro loop;&lt;BR /&gt;
%do i=1 %to &amp;amp;count ;&lt;BR /&gt;
data single;&lt;BR /&gt;
 set comb;&lt;BR /&gt;
 if count eq &amp;amp;i;&lt;BR /&gt;
run;&lt;BR /&gt;
&lt;BR /&gt;
data  middle;&lt;BR /&gt;
 set temp_unique single;&lt;BR /&gt;
run;&lt;BR /&gt;
&lt;BR /&gt;
data want_middle;&lt;BR /&gt;
 declare hash ha (hashexp:10);&lt;BR /&gt;
  ha.definekey('_boss');&lt;BR /&gt;
  ha.definedata('sub');&lt;BR /&gt;
  ha.definedone();&lt;BR /&gt;
&lt;BR /&gt;
 do until(last);&lt;BR /&gt;
  set middle(rename=(boss=_boss)) end=last;&lt;BR /&gt;
  ha.add();&lt;BR /&gt;
 end;&lt;BR /&gt;
&lt;BR /&gt;
 do until(_last);&lt;BR /&gt;
  set middle end=_last;&lt;BR /&gt;
   output;&lt;BR /&gt;
   _boss=boss;&lt;BR /&gt;
   do until(rc ne 0 or count gt 10000); &lt;BR /&gt;
    count+1;&lt;BR /&gt;
    rc=ha.find();&lt;BR /&gt;
    if rc = 0 then output;&lt;BR /&gt;
    _boss=sub;&lt;BR /&gt;
   end;&lt;BR /&gt;
  end;&lt;BR /&gt;
drop _boss rc;&lt;BR /&gt;
run;&lt;BR /&gt;
proc append base=want data=want_middle force;&lt;BR /&gt;
run;&lt;BR /&gt;
%end;&lt;BR /&gt;
&lt;BR /&gt;
%mend loop;&lt;BR /&gt;
&lt;BR /&gt;
%loop&lt;BR /&gt;
&lt;BR /&gt;
&lt;BR /&gt;
&lt;BR /&gt;
&lt;BR /&gt;
proc sort data=want out=final_want(drop=count) nodupkey;&lt;BR /&gt;
 by boss sub;&lt;BR /&gt;
run;&lt;BR /&gt;
&lt;BR /&gt;
&lt;BR /&gt;
&lt;BR /&gt;
&lt;BR /&gt;
 &lt;BR /&gt;
&lt;BR /&gt;
 &lt;BR /&gt;
[/pre]&lt;BR /&gt;
&lt;BR /&gt;
&lt;BR /&gt;
And I also consider an problem about your question&lt;BR /&gt;
Namely, dead loop.For example:  Dave-&amp;gt;Jim   Jim-&amp;gt;Dave&lt;BR /&gt;
&lt;BR /&gt;
Cheers!!!!&lt;BR /&gt;
Ksharp&lt;BR /&gt;
&lt;BR /&gt;
Message was edited by: Ksharp

Message was edited by: Ksharp</description>
      <pubDate>Mon, 20 Jun 2011 02:07:13 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/comparing-columns-and-creating-new-ones/m-p/13416#M1564</guid>
      <dc:creator>Ksharp</dc:creator>
      <dc:date>2011-06-20T02:07:13Z</dc:date>
    </item>
  </channel>
</rss>

