<?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: writing a macro to compute results for three variables in SAS Programming</title>
    <link>https://communities.sas.com/t5/SAS-Programming/writing-a-macro-to-compute-results-for-three-variables/m-p/389453#M93379</link>
    <description>&lt;P&gt;You should use arrays not a macro here.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://stats.idre.ucla.edu/sas/seminars/sas-arrays/" target="_blank"&gt;https://stats.idre.ucla.edu/sas/seminars/sas-arrays/&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Additionally you can consider using a format instead of IF/THEN statements.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;This paper has some good examples.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;A href="http://www2.sas.com/proceedings/sugi30/001-30.pdf" target="_blank"&gt;http://www2.sas.com/proceedings/sugi30/001-30.pdf&lt;/A&gt;&lt;/P&gt;</description>
    <pubDate>Mon, 21 Aug 2017 05:50:14 GMT</pubDate>
    <dc:creator>Reeza</dc:creator>
    <dc:date>2017-08-21T05:50:14Z</dc:date>
    <item>
      <title>writing a macro to compute results for three variables</title>
      <link>https://communities.sas.com/t5/SAS-Programming/writing-a-macro-to-compute-results-for-three-variables/m-p/389452#M93378</link>
      <description>&lt;P&gt;I want to write a macro for the following piece of code:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;data nd;&lt;BR /&gt;set nd;&lt;BR /&gt;if in2016=1 then do;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;if road = 98 then air_a = 98; /*non*/&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;else if road = 2 then air_a = 0;&lt;BR /&gt;end;&lt;BR /&gt;&lt;BR /&gt;if road = 1 then do;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;if car_a in (10, 1) then bike_res_a = 0; /*withdrew or completed*/&lt;BR /&gt;end;&lt;BR /&gt;&lt;BR /&gt;if car_a in (2,4) then do; * currently or deferred;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;if bike_a = 1 then bike_res_a = 0; *year12;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;else if bike_a in (2,3,4,5,6) then bike_res_a = bike_a - 1;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;else if bike_a in (7,8,9,10) then bike_res_a = 6;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;else if bike_a&amp;nbsp; =&amp;nbsp; 11&amp;nbsp; then bike_res_a = 7;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;else if bike_a&amp;nbsp; in (12 13) then bike_res_a = 8;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;else if bike_a&amp;nbsp; =&amp;nbsp; 14 then bike_res_a = 9;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;else if bike_a&amp;nbsp; &amp;gt;= 15 then bike_res_a = 0;&lt;BR /&gt;end;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;BR /&gt;run;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;I want this to run through three times. One where there is _a, one where there is _b and one where there is _c. So I want to run through a,b,c. Just wandering how to do this in a macro?&lt;/P&gt;</description>
      <pubDate>Mon, 21 Aug 2017 05:45:48 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/writing-a-macro-to-compute-results-for-three-variables/m-p/389452#M93378</guid>
      <dc:creator>BenBrady</dc:creator>
      <dc:date>2017-08-21T05:45:48Z</dc:date>
    </item>
    <item>
      <title>Re: writing a macro to compute results for three variables</title>
      <link>https://communities.sas.com/t5/SAS-Programming/writing-a-macro-to-compute-results-for-three-variables/m-p/389453#M93379</link>
      <description>&lt;P&gt;You should use arrays not a macro here.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://stats.idre.ucla.edu/sas/seminars/sas-arrays/" target="_blank"&gt;https://stats.idre.ucla.edu/sas/seminars/sas-arrays/&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Additionally you can consider using a format instead of IF/THEN statements.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;This paper has some good examples.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;A href="http://www2.sas.com/proceedings/sugi30/001-30.pdf" target="_blank"&gt;http://www2.sas.com/proceedings/sugi30/001-30.pdf&lt;/A&gt;&lt;/P&gt;</description>
      <pubDate>Mon, 21 Aug 2017 05:50:14 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/writing-a-macro-to-compute-results-for-three-variables/m-p/389453#M93379</guid>
      <dc:creator>Reeza</dc:creator>
      <dc:date>2017-08-21T05:50:14Z</dc:date>
    </item>
    <item>
      <title>Re: writing a macro to compute results for three variables</title>
      <link>https://communities.sas.com/t5/SAS-Programming/writing-a-macro-to-compute-results-for-three-variables/m-p/389469#M93384</link>
      <description>&lt;P&gt;Use array processing, as &lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/13879"&gt;@Reeza&lt;/a&gt; already suggested.&lt;/P&gt;
&lt;P&gt;And replace the if-then-else-if chain with a select block:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data nd;
set nd;
array bikes {3} bike_a bike_b bike_c;
array bikeres {3} bike_res_a bike_res_b bike_res_c;
if in2016=1 then do;
    if road = 98 then air_a = 98; /*non*/
    else if road = 2 then air_a = 0;
end;

if road = 1 then do;
    if car_a in (10, 1) then bike_res_a = 0; /*withdrew or completed*/
end;

if car_a in (2,4) then do; * currently or deferred;
  do i = 1 to 3;
    select (bikes{i});
      when (1) bike_res{i} = 0; *year12;
      when (2,3,4,5,6) bike_res{i} = bikes{i} - 1;
      when (7,8,9,10) bike_res{i} = 6;
      when (11) bike_res{i} = 7;
      when (12,13) bike_res{i} = 8;
      when (14) bike_res{i} = 9;
      otherwise bike_res{i} = 0;
    end; * select;
  end; * iterative do;
end;
drop i;
run;&lt;/CODE&gt;&lt;/PRE&gt;</description>
      <pubDate>Mon, 21 Aug 2017 07:38:19 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/writing-a-macro-to-compute-results-for-three-variables/m-p/389469#M93384</guid>
      <dc:creator>Kurt_Bremser</dc:creator>
      <dc:date>2017-08-21T07:38:19Z</dc:date>
    </item>
    <item>
      <title>Re: writing a macro to compute results for three variables</title>
      <link>https://communities.sas.com/t5/SAS-Programming/writing-a-macro-to-compute-results-for-three-variables/m-p/389475#M93388</link>
      <description>&lt;P&gt;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/11562"&gt;@Kurt_Bremser&lt;/a&gt;, your code doesn't replace all &amp;nbsp;&amp;nbsp;&lt;STRONG&gt;_a&lt;/STRONG&gt;&amp;nbsp; &amp;nbsp;variables as asked. &amp;nbsp; See lines:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;/*-------------------------------------------------------------------------------------------------/&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;CODE class="  language-sas"&gt;&lt;/CODE&gt;&lt;CODE class="  language-sas"&gt;&lt;SPAN class="token keyword"&gt;if&lt;/SPAN&gt; in2016&lt;SPAN class="token operator"&gt;=&lt;/SPAN&gt;&lt;SPAN class="token number"&gt;1&lt;/SPAN&gt; &lt;SPAN class="token keyword"&gt;then&lt;/SPAN&gt; do&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt; &lt;/CODE&gt;&lt;/P&gt;
&lt;P&gt;&lt;CODE class="  language-sas"&gt;&lt;SPAN class="token keyword"&gt;&amp;nbsp; &amp;nbsp;if&lt;/SPAN&gt; road &lt;SPAN class="token operator"&gt;=&lt;/SPAN&gt; &lt;SPAN class="token number"&gt;98&lt;/SPAN&gt; &lt;SPAN class="token keyword"&gt;then&lt;/SPAN&gt; &lt;STRONG&gt;air_a&lt;/STRONG&gt; &lt;SPAN class="token operator"&gt;=&lt;/SPAN&gt; &lt;SPAN class="token number"&gt;98&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt; &lt;SPAN class="token comment"&gt;/*non*/&lt;/SPAN&gt; &lt;/CODE&gt;&lt;/P&gt;
&lt;P&gt;&lt;CODE class="  language-sas"&gt;&lt;SPAN class="token keyword"&gt;&amp;nbsp; &amp;nbsp;else&lt;/SPAN&gt; &lt;SPAN class="token keyword"&gt;if&lt;/SPAN&gt; road &lt;SPAN class="token operator"&gt;=&lt;/SPAN&gt; &lt;SPAN class="token number"&gt;2&lt;/SPAN&gt; &lt;SPAN class="token keyword"&gt;then&lt;/SPAN&gt; &lt;STRONG&gt;air_a&lt;/STRONG&gt; &lt;SPAN class="token operator"&gt;=&lt;/SPAN&gt; &lt;SPAN class="token number"&gt;0&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt; end&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/P&gt;
&lt;P&gt;&lt;CODE class="  language-sas"&gt;&lt;SPAN class="token keyword"&gt;if&lt;/SPAN&gt; road &lt;SPAN class="token operator"&gt;=&lt;/SPAN&gt; &lt;SPAN class="token number"&gt;1&lt;/SPAN&gt; &lt;SPAN class="token keyword"&gt;then&lt;/SPAN&gt; do&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt; &lt;/CODE&gt;&lt;/P&gt;
&lt;P&gt;&lt;CODE class="  language-sas"&gt;&lt;SPAN class="token keyword"&gt;&amp;nbsp; &amp;nbsp;if&lt;/SPAN&gt; &lt;STRONG&gt;car_a&lt;/STRONG&gt; &lt;SPAN class="token operator"&gt;in&lt;/SPAN&gt; &lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;&lt;SPAN class="token number"&gt;10&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;,&lt;/SPAN&gt; &lt;SPAN class="token number"&gt;1&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt; &lt;SPAN class="token keyword"&gt;then&lt;/SPAN&gt; &lt;STRONG&gt;bike_res_a&lt;/STRONG&gt; &lt;SPAN class="token operator"&gt;=&lt;/SPAN&gt; &lt;SPAN class="token number"&gt;0&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt; &lt;SPAN class="token comment"&gt;/*withdrew or completed*/&lt;/SPAN&gt; &lt;/CODE&gt;&lt;/P&gt;
&lt;P&gt;&lt;CODE class="  language-sas"&gt;end&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt; &lt;/CODE&gt;&lt;/P&gt;
&lt;P&gt;&lt;CODE class="  language-sas"&gt;&lt;SPAN class="token keyword"&gt;if&lt;/SPAN&gt; &lt;STRONG&gt;car_a&lt;/STRONG&gt; &lt;SPAN class="token operator"&gt;in&lt;/SPAN&gt; &lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;&lt;SPAN class="token number"&gt;2&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;,&lt;/SPAN&gt;&lt;SPAN class="token number"&gt;4&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt; &lt;SPAN class="token keyword"&gt;then&lt;/SPAN&gt; do&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;/*-------------------------------------------------------------------------------------------------/&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Therefore, I think it is easier to be done by a macro.&lt;/P&gt;
&lt;P&gt;I too preffer the CASE instead IF-THEN-ELSE method.&lt;/P&gt;
&lt;P&gt;So proposed code is:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;%macro doit(suffix);
	if in2016=1 then do;
		if road = 98 then air&amp;amp;suffix. = 98; /*non*/
		else if road = 2 then air&amp;amp;suffix. = 0;
	end;

	if road = 1 then do;
		if car&amp;amp;suffix. in (10, 1) then bike_res&amp;amp;suffix. = 0; /*withdrew or completed*/
	end;

	if car&amp;amp;suffix. in (2,4) then do; * currently or deferred;
	   select (bikes&amp;amp;suffix.);
		  when (1) bike_res&amp;amp;suffix. = 0; *year12;
		  when (2,3,4,5,6) bike_res&amp;amp;suffix. = bikes&amp;amp;suffix. - 1;
		  when (7,8,9,10) bike_res&amp;amp;suffix. = 6;
		  when (11) bike_res&amp;amp;suffix. = 7;
		  when (12,13) bike_res&amp;amp;suffix. = 8;
		  when (14) bike_res&amp;amp;suffix. = 9;
		  otherwise bike_res&amp;amp;suffix. = 0;
	   end; * select;
	end;
%mend doit;

data nd;
set nd;
    %doit(_a);     
    %doit(_b);     
    %doit(_c); 
run;    
&lt;/CODE&gt;&lt;/PRE&gt;</description>
      <pubDate>Mon, 21 Aug 2017 09:09:14 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/writing-a-macro-to-compute-results-for-three-variables/m-p/389475#M93388</guid>
      <dc:creator>Shmuel</dc:creator>
      <dc:date>2017-08-21T09:09:14Z</dc:date>
    </item>
    <item>
      <title>Re: writing a macro to compute results for three variables</title>
      <link>https://communities.sas.com/t5/SAS-Programming/writing-a-macro-to-compute-results-for-three-variables/m-p/389485#M93392</link>
      <description>&lt;P&gt;Yes, then the do loop needs to be moved out one level to cover all variables:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data nd;
set nd;
array airs {3} air_a air_b air_c;
array cars {3} car_a car_b car_c;
array bikes {3} bike_a bike_b bike_c;
array bikeres {3} bike_res_a bike_res_b bike_res_c;
do i = 1 to 3;
  in2016 = 1 then do;
    if road = 98 then airs{i} = 98; /*non*/
    else if road = 2 then airs{i} = 0;
  end;
  if road = 1 then do;
    if cars{i} in (10,1) then bikeres{i} = 0; /*withdrew or completed*/
  end;
  if car_a in (2,4) then do; * currently or deferred;
    select (bikes{i});
      when (1) bike_res{i} = 0; *year12;
      when (2,3,4,5,6) bike_res{i} = bikes{i} - 1;
      when (7,8,9,10) bike_res{i} = 6;
      when (11) bike_res{i} = 7;
      when (12,13) bike_res{i} = 8;
      when (14) bike_res{i} = 9;
      otherwise bike_res{i} = 0;
    end; * select;
  end;
end; * iterative do;
drop i;
run;&lt;/CODE&gt;&lt;/PRE&gt;</description>
      <pubDate>Mon, 21 Aug 2017 10:45:24 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/writing-a-macro-to-compute-results-for-three-variables/m-p/389485#M93392</guid>
      <dc:creator>Kurt_Bremser</dc:creator>
      <dc:date>2017-08-21T10:45:24Z</dc:date>
    </item>
    <item>
      <title>Re: writing a macro to compute results for three variables</title>
      <link>https://communities.sas.com/t5/SAS-Programming/writing-a-macro-to-compute-results-for-three-variables/m-p/389499#M93394</link>
      <description>&lt;P&gt;Just use arrays. &amp;nbsp;Take your code and replace _a with (i) and add the array statements and a DO loop.&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data nd;
  set nd;
  array air air_a air_b air_c ;
  array car car_a car_b car_c ;
  array bike bike_a bike_b bike_c ;
  array bike_res bike_res_a bike_res_b bike_res_c;
  do i=1 to dim(air);
    if in2016=1 then do;
      if road = 98 then air(i) = 98; /*non*/
      else if road = 2 then air(i) = 0;
    end;

    if road = 1 then do;
      if car(i) in (10, 1) then bike_res(i) = 0; /*withdrew or completed*/
    end;

    if car(i) in (2,4) then do; * currently or deferred;
      if bike(i) = 1 then bike_res(i) = 0; *year12;
      else if bike(i) in (2,3,4,5,6) then bike_res(i) = bike(i) - 1;
      else if bike(i) in (7,8,9,10) then bike_res(i) = 6;
      else if bike(i)  =  11  then bike_res(i) = 7;
      else if bike(i)  in (12 13) then bike_res(i) = 8;
      else if bike(i)  =  14 then bike_res(i) = 9;
      else if bike(i)  &amp;gt;= 15 then bike_res(i) = 0;
    end;
  end;      
run;&lt;/CODE&gt;&lt;/PRE&gt;</description>
      <pubDate>Mon, 21 Aug 2017 12:40:16 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/writing-a-macro-to-compute-results-for-three-variables/m-p/389499#M93394</guid>
      <dc:creator>Tom</dc:creator>
      <dc:date>2017-08-21T12:40:16Z</dc:date>
    </item>
  </channel>
</rss>

