<?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: Concatenate multiple equalities together in SAS Programming</title>
    <link>https://communities.sas.com/t5/SAS-Programming/Concatenate-multiple-equalities-together/m-p/280989#M56891</link>
    <description>&lt;P&gt;The hash table is the best suited I reckon.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;Assuming data set sorted and organised so that&amp;nbsp;ID1 is smaller than ID2.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data HAVE;
input ID1  ID2  ;
cards;
1 3
2 3
5 9
6 9 
;
run;
data _null_;
  retain GRP;
  if _N_=1 then do;  
    ID=.; GROUP=.;
    dcl hash H(ordered:'a');
    H.definekey('ID');
    H.definedata('ID','GROUP');
    H.definedone();
  end;
  set HAVE end=LASTOBS;;
  RC1=H.find(key:ID1);
  if RC1=0 then GRP1=GROUP;
  RC2=H.find(key:ID2);
  if RC2=0 then GRP2=GROUP;
  if RC1=0 and RC2=0 then return;
  else if RC1=0 then do;
    H.add(KEY:ID2, data:ID2, data:GRP1);
  end;
  else if RC2=0 then do;
    H.add(KEY:ID1, data:ID1, data:GRP2);
  end;
  else do;
    GRP+1;
    H.add(key:ID1, data:ID1, data:GRP);
    H.add(key:ID2, data:ID2, data:GRP);
  end;
  if LASTOBS then H.output(dataset:'WANT');
run;
proc print data=WANT;
run;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;DIV align="center"&gt;
&lt;TABLE class="table" rules="all" frame="box" cellspacing="0" cellpadding="5" summary="Procedure Print: Data Set WORK.WANT"&gt;&lt;COLGROUP&gt; &lt;COL /&gt;&lt;/COLGROUP&gt; &lt;COLGROUP&gt; &lt;COL /&gt; &lt;COL /&gt;&lt;/COLGROUP&gt;
&lt;THEAD&gt;
&lt;TR&gt;
&lt;TH class="r header" scope="col"&gt;Obs&lt;/TH&gt;
&lt;TH class="r header" scope="col"&gt;ID&lt;/TH&gt;
&lt;TH class="r header" scope="col"&gt;GROUP&lt;/TH&gt;
&lt;/TR&gt;
&lt;/THEAD&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TH class="r rowheader" scope="row"&gt;1&lt;/TH&gt;
&lt;TD class="r data"&gt;1&lt;/TD&gt;
&lt;TD class="r data"&gt;1&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TH class="r rowheader" scope="row"&gt;2&lt;/TH&gt;
&lt;TD class="r data"&gt;2&lt;/TD&gt;
&lt;TD class="r data"&gt;1&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TH class="r rowheader" scope="row"&gt;3&lt;/TH&gt;
&lt;TD class="r data"&gt;3&lt;/TD&gt;
&lt;TD class="r data"&gt;1&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TH class="r rowheader" scope="row"&gt;4&lt;/TH&gt;
&lt;TD class="r data"&gt;5&lt;/TD&gt;
&lt;TD class="r data"&gt;2&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TH class="r rowheader" scope="row"&gt;5&lt;/TH&gt;
&lt;TD class="r data"&gt;6&lt;/TD&gt;
&lt;TD class="r data"&gt;2&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TH class="r rowheader" scope="row"&gt;6&lt;/TH&gt;
&lt;TD class="r data"&gt;9&lt;/TD&gt;
&lt;TD class="r data"&gt;2&lt;/TD&gt;
&lt;/TR&gt;
&lt;/TBODY&gt;
&lt;/TABLE&gt;
&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
    <pubDate>Wed, 29 Jun 2016 07:05:26 GMT</pubDate>
    <dc:creator>ChrisNZ</dc:creator>
    <dc:date>2016-06-29T07:05:26Z</dc:date>
    <item>
      <title>Concatenate multiple equalities together</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Concatenate-multiple-equalities-together/m-p/280457#M56679</link>
      <description>&lt;P&gt;I have a SAS Datasets with multiple equalities: i.e. A=C, B=C etc. and I would like to make concatenate it into one line to A=B=C.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;For example IDs in 1 and 2 represent equality,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;ID1, ID2;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;1,3;&lt;/P&gt;&lt;P&gt;2,3;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;I would like to make these into&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;ID1, ID2, ID3;&lt;/P&gt;&lt;P&gt;1, 2, 3;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Would there be a good algorithm to do this?&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Mon, 27 Jun 2016 15:27:17 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Concatenate-multiple-equalities-together/m-p/280457#M56679</guid>
      <dc:creator>kimih0223</dc:creator>
      <dc:date>2016-06-27T15:27:17Z</dc:date>
    </item>
    <item>
      <title>Re: Concatenate multiple equalities together</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Concatenate-multiple-equalities-together/m-p/280989#M56891</link>
      <description>&lt;P&gt;The hash table is the best suited I reckon.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;Assuming data set sorted and organised so that&amp;nbsp;ID1 is smaller than ID2.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data HAVE;
input ID1  ID2  ;
cards;
1 3
2 3
5 9
6 9 
;
run;
data _null_;
  retain GRP;
  if _N_=1 then do;  
    ID=.; GROUP=.;
    dcl hash H(ordered:'a');
    H.definekey('ID');
    H.definedata('ID','GROUP');
    H.definedone();
  end;
  set HAVE end=LASTOBS;;
  RC1=H.find(key:ID1);
  if RC1=0 then GRP1=GROUP;
  RC2=H.find(key:ID2);
  if RC2=0 then GRP2=GROUP;
  if RC1=0 and RC2=0 then return;
  else if RC1=0 then do;
    H.add(KEY:ID2, data:ID2, data:GRP1);
  end;
  else if RC2=0 then do;
    H.add(KEY:ID1, data:ID1, data:GRP2);
  end;
  else do;
    GRP+1;
    H.add(key:ID1, data:ID1, data:GRP);
    H.add(key:ID2, data:ID2, data:GRP);
  end;
  if LASTOBS then H.output(dataset:'WANT');
run;
proc print data=WANT;
run;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;DIV align="center"&gt;
&lt;TABLE class="table" rules="all" frame="box" cellspacing="0" cellpadding="5" summary="Procedure Print: Data Set WORK.WANT"&gt;&lt;COLGROUP&gt; &lt;COL /&gt;&lt;/COLGROUP&gt; &lt;COLGROUP&gt; &lt;COL /&gt; &lt;COL /&gt;&lt;/COLGROUP&gt;
&lt;THEAD&gt;
&lt;TR&gt;
&lt;TH class="r header" scope="col"&gt;Obs&lt;/TH&gt;
&lt;TH class="r header" scope="col"&gt;ID&lt;/TH&gt;
&lt;TH class="r header" scope="col"&gt;GROUP&lt;/TH&gt;
&lt;/TR&gt;
&lt;/THEAD&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TH class="r rowheader" scope="row"&gt;1&lt;/TH&gt;
&lt;TD class="r data"&gt;1&lt;/TD&gt;
&lt;TD class="r data"&gt;1&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TH class="r rowheader" scope="row"&gt;2&lt;/TH&gt;
&lt;TD class="r data"&gt;2&lt;/TD&gt;
&lt;TD class="r data"&gt;1&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TH class="r rowheader" scope="row"&gt;3&lt;/TH&gt;
&lt;TD class="r data"&gt;3&lt;/TD&gt;
&lt;TD class="r data"&gt;1&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TH class="r rowheader" scope="row"&gt;4&lt;/TH&gt;
&lt;TD class="r data"&gt;5&lt;/TD&gt;
&lt;TD class="r data"&gt;2&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TH class="r rowheader" scope="row"&gt;5&lt;/TH&gt;
&lt;TD class="r data"&gt;6&lt;/TD&gt;
&lt;TD class="r data"&gt;2&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TH class="r rowheader" scope="row"&gt;6&lt;/TH&gt;
&lt;TD class="r data"&gt;9&lt;/TD&gt;
&lt;TD class="r data"&gt;2&lt;/TD&gt;
&lt;/TR&gt;
&lt;/TBODY&gt;
&lt;/TABLE&gt;
&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Wed, 29 Jun 2016 07:05:26 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Concatenate-multiple-equalities-together/m-p/280989#M56891</guid>
      <dc:creator>ChrisNZ</dc:creator>
      <dc:date>2016-06-29T07:05:26Z</dc:date>
    </item>
  </channel>
</rss>

