<?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 values accross rows and columns in SAS Programming</title>
    <link>https://communities.sas.com/t5/SAS-Programming/Comparing-values-accross-rows-and-columns/m-p/482125#M286832</link>
    <description>&lt;P&gt;Thank you so much! Worked like a charm and it is so efficient!&amp;nbsp;&lt;/P&gt;</description>
    <pubDate>Sat, 28 Jul 2018 01:07:49 GMT</pubDate>
    <dc:creator>ameriel</dc:creator>
    <dc:date>2018-07-28T01:07:49Z</dc:date>
    <item>
      <title>Comparing values accross rows and columns</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Comparing-values-accross-rows-and-columns/m-p/482113#M286830</link>
      <description>&lt;P&gt;Hello everyone, I am new to SAS and data management in general so I would really appreciate any help!&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;I have a dataset with multiple rows per subject and multiple columns of diagnoses codes for each row. For each subject i want to set any duplicate diagnoses as missing. The problem is that the duplicate diagnoses are in different rows. So I have:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Subject&amp;nbsp; &amp;nbsp; D1&amp;nbsp; &amp;nbsp; D2&amp;nbsp; &amp;nbsp;D3&amp;nbsp; &amp;nbsp;D4&amp;nbsp; &amp;nbsp;D5&amp;nbsp;&lt;/P&gt;&lt;P&gt;1&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;a&amp;nbsp; &amp;nbsp; &amp;nbsp; b&amp;nbsp; &amp;nbsp; &amp;nbsp;c&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;d&amp;nbsp; &amp;nbsp; &amp;nbsp; e&lt;/P&gt;&lt;P&gt;1&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;a&amp;nbsp; &amp;nbsp; &amp;nbsp; d&amp;nbsp; &amp;nbsp; &amp;nbsp; .&amp;nbsp; &amp;nbsp; &amp;nbsp; .&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;.&lt;/P&gt;&lt;P&gt;1&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;f&amp;nbsp; &amp;nbsp; &amp;nbsp; a&amp;nbsp; &amp;nbsp; &amp;nbsp;b&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;.&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;.&lt;/P&gt;&lt;P&gt;2&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;g&amp;nbsp; &amp;nbsp; &amp;nbsp; c&amp;nbsp; &amp;nbsp; h&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; e&amp;nbsp; &amp;nbsp; &amp;nbsp; d&lt;/P&gt;&lt;P&gt;2&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;e&amp;nbsp; &amp;nbsp; &amp;nbsp; d&amp;nbsp; &amp;nbsp; &amp;nbsp; j&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;.&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;and&amp;nbsp; want:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Subject&amp;nbsp; &amp;nbsp; D1&amp;nbsp; &amp;nbsp; D2&amp;nbsp; &amp;nbsp;D3&amp;nbsp; &amp;nbsp;D4&amp;nbsp; &amp;nbsp;D5&amp;nbsp;&lt;/P&gt;&lt;P&gt;1&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;a&amp;nbsp; &amp;nbsp; &amp;nbsp; b&amp;nbsp; &amp;nbsp; &amp;nbsp;c&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;d&amp;nbsp; &amp;nbsp; &amp;nbsp; e&lt;/P&gt;&lt;P&gt;1&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; .&amp;nbsp; &amp;nbsp; &amp;nbsp; .&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;.&lt;/P&gt;&lt;P&gt;1&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;f&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;.&lt;/P&gt;&lt;P&gt;2&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;g&amp;nbsp; &amp;nbsp; &amp;nbsp; c&amp;nbsp; &amp;nbsp; h&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; e&amp;nbsp; &amp;nbsp; &amp;nbsp; d&lt;/P&gt;&lt;P&gt;2&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; &amp;nbsp;j&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;.&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;I can transpose from long to wide format and then use an array to compare among codes, set duplicates as missing and transpose back to long. But this is inefficient however as in the wide format i will end up with more than 2000 columns. Is there a more efficient way?&amp;nbsp;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Thank you in advance!&lt;/P&gt;</description>
      <pubDate>Fri, 27 Jul 2018 23:14:25 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Comparing-values-accross-rows-and-columns/m-p/482113#M286830</guid>
      <dc:creator>ameriel</dc:creator>
      <dc:date>2018-07-27T23:14:25Z</dc:date>
    </item>
    <item>
      <title>Re: Comparing values accross rows and columns</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Comparing-values-accross-rows-and-columns/m-p/482122#M286831</link>
      <description>&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data have;
input (Subject    D1    D2   D3   D4   D5 ) ($);
cards;
1               a      b     c       d      e
1               a      d      .      .       .
1               f      a     b       .       .
2               g      c    h        e      d
2               e      d      j       .         .
;


data want;
 if _n_ = 1 then do ;                          
    dcl hash h ( multidata:"y") ;
    h.definekey ("subject",'d') ;                   
    h.definedata ("subject",'d') ; 
	h.definedone(); 
	end;
set have ;
by subject;
array t(*) d1-d5;
do n=1 to dim(t);
d=t(n);
rc=h.check();
h.add(); 
if rc=0  then call missing(t(n));
end;
drop rc n d;
run;&lt;/CODE&gt;&lt;/PRE&gt;</description>
      <pubDate>Sat, 28 Jul 2018 00:33:02 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Comparing-values-accross-rows-and-columns/m-p/482122#M286831</guid>
      <dc:creator>novinosrin</dc:creator>
      <dc:date>2018-07-28T00:33:02Z</dc:date>
    </item>
    <item>
      <title>Re: Comparing values accross rows and columns</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Comparing-values-accross-rows-and-columns/m-p/482125#M286832</link>
      <description>&lt;P&gt;Thank you so much! Worked like a charm and it is so efficient!&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Sat, 28 Jul 2018 01:07:49 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Comparing-values-accross-rows-and-columns/m-p/482125#M286832</guid>
      <dc:creator>ameriel</dc:creator>
      <dc:date>2018-07-28T01:07:49Z</dc:date>
    </item>
    <item>
      <title>Re: Comparing values accross rows and columns</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Comparing-values-accross-rows-and-columns/m-p/482127#M286833</link>
      <description>&lt;P&gt;Hash can be useful, but for this nail, I don't think you need that big a hammer.&amp;nbsp;&amp;nbsp;&amp;nbsp; Just keep a retained space-separated list of d values (variables _d_list) for a given id.&amp;nbsp; Then check subsequent d values against that list, with the result of either expanding the list with a new d value, or setting the d value to missing.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data have;
input (Subject    D1    D2   D3   D4   D5 ) ($);
cards;
1               a      b     c       d      e
1               a      d      .      .       .
1               f      a     b       .       .
2               g      c    h        e      d
2               e      d      j       .         .
;

data want;
  set have;
  by subject;
  length _d_list $300;
  retain _d_list;
  array d {*} d1-d5;
  if first.subject then _d_list=catx(' ',of d{*});
  else do _i=1 to dim(d) while (d{_i}^=' ');
    if findw(trim(_d_list),trim(d{_i}))=0 then _d_list=catx(' ',_d_list,d{_i});
    else d{_i}=' ';
  end;
  drop _: ;
run;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;This program assumes (1) the data are sorted by subject, (2) the first record for each subject has no duplicate d-values, (3) that obeservations with less the 5 non-missing d-values have all the non-missing at the left end of the d-variables.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Make sure the length of _d_list is sufficient to hold the maximum number of space-separated distinct d values.&lt;/P&gt;</description>
      <pubDate>Sat, 28 Jul 2018 01:12:21 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Comparing-values-accross-rows-and-columns/m-p/482127#M286833</guid>
      <dc:creator>mkeintz</dc:creator>
      <dc:date>2018-07-28T01:12:21Z</dc:date>
    </item>
    <item>
      <title>Re: Comparing values accross rows and columns</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Comparing-values-accross-rows-and-columns/m-p/482137#M286834</link>
      <description>&lt;P&gt;Easiest would probably be to just transpose vertically and deduplicate with PROC SORT by subject and diagnosis.&amp;nbsp; But if you want to keep the original structure, maybe this:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;proc sort data=have; by subject; run;

proc sql noprint;
select max(n)*5 into :maxD from	
	(select subject, count(*) as n 
	from have group by subject);
quit;

data have;
set have;
by subject;
array U {&amp;amp;maxD} $10 _temporary_;
array d {*} D1-D5;
if first.subject then do;
	do i=1 to dim(U);
		U[i]='';
	end;
	n=0;
end;
do i=1 to dim(d);
	if not missing(d[i]) then do;
		if d[i] in U then d[i]='';
		else do;
			n+1;
			U[n]=d[i];
		end;
	end;
end;
run;&lt;/CODE&gt;&lt;/PRE&gt;</description>
      <pubDate>Sat, 28 Jul 2018 03:04:48 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Comparing-values-accross-rows-and-columns/m-p/482137#M286834</guid>
      <dc:creator>quickbluefish</dc:creator>
      <dc:date>2018-07-28T03:04:48Z</dc:date>
    </item>
    <item>
      <title>Re: Comparing values accross rows and columns</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Comparing-values-accross-rows-and-columns/m-p/482138#M286835</link>
      <description>&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;/*a little cleaner than previous*/
data want;
 if _n_ = 1 then do ;                          
    declare hash h ( ) ;*further edited;
    h.definekey ("subject",'d') ;                   
    h.definedata ("subject",'d') ; 
	h.definedone(); 
	end;
set have ;
by subject;
array t(*) d1-d5;
do n=1 to dim(t);
d=t(n);
rc=h.check();
h.replace();  *further edited;
if rc=0  then call missing(t(n));
end;
drop rc n d;
run;&lt;/CODE&gt;&lt;/PRE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Sat, 28 Jul 2018 03:06:18 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Comparing-values-accross-rows-and-columns/m-p/482138#M286835</guid>
      <dc:creator>novinosrin</dc:creator>
      <dc:date>2018-07-28T03:06:18Z</dc:date>
    </item>
    <item>
      <title>Re: Comparing values accross rows and columns</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Comparing-values-accross-rows-and-columns/m-p/482206#M286836</link>
      <description>&lt;P&gt;Thanks so much everyone for the help, I made it work clean and fast!&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Sat, 28 Jul 2018 21:19:43 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Comparing-values-accross-rows-and-columns/m-p/482206#M286836</guid>
      <dc:creator>ameriel</dc:creator>
      <dc:date>2018-07-28T21:19:43Z</dc:date>
    </item>
  </channel>
</rss>

