<?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: infinite do-while loop in SAS Programming</title>
    <link>https://communities.sas.com/t5/SAS-Programming/infinite-do-while-loop/m-p/92247#M19470</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Maybe you want %DO %WHILE.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;If you don't then you have data step and macro all mixed up.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Fri, 29 Mar 2013 13:23:34 GMT</pubDate>
    <dc:creator>data_null__</dc:creator>
    <dc:date>2013-03-29T13:23:34Z</dc:date>
    <item>
      <title>infinite do-while loop</title>
      <link>https://communities.sas.com/t5/SAS-Programming/infinite-do-while-loop/m-p/92246#M19469</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;I'm fairly new to the SAS macro facility, and try to write a code that sorts variable X into quantiles.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I cannot use PROC RANK because the quantiles may not always be of identical size. &lt;SPAN style="font-size: 10pt; line-height: 1.5em;"&gt;So I use &lt;/SPAN&gt;&lt;SPAN style="font-size: 10pt;"&gt;PROC UNIVARIATE with the option "pctlpts = &amp;amp;startperc1 to &amp;amp;endperc1 by &amp;amp;stepperc1 pctlpre=pf1_" to generate quantiles p1_20, ..., p1_60:&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 10pt;"&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;To present you my problem, &lt;SPAN style="font-size: 10pt;"&gt;I converted my macro-code into open code by deleting the "%" in front of %do, %while, and %end. I define:&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;%let startperc1=20;&lt;/P&gt;&lt;P&gt;%let endperc1=60;&lt;/P&gt;&lt;P&gt;%let stepperc1=20;&lt;/P&gt;&lt;P&gt;%let sortingvar1=X;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;The code I have now is:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;%let nowperc=%eval(&amp;amp;startperc1);&lt;/P&gt;&lt;P&gt;%let prevperc=%eval(&amp;amp;startperc1-&amp;amp;nowperc);&lt;/P&gt;&lt;P&gt;data newdata;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; set data;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pf1_0 = 0;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; do while (%eval(&amp;amp;nowperc) lt %eval(&amp;amp;endperc1));&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if &amp;amp;sortingvar1&amp;gt;=pf1_&amp;amp;prevperc AND &amp;amp;sortingvar1&amp;lt;pf1_&amp;amp;nowperc then rank = %eval(( &amp;amp;nowperc - &amp;amp;startperc1 ) / &amp;amp;stepperc1 +1);&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; %let nowperc = %eval(&amp;amp;nowperc + &amp;amp;stepperc1);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; %let prevperc = %eval(&amp;amp;prevperc + &amp;amp;stepperc1);&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 10pt; line-height: 1.5em;"&gt;end;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;run;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;This code looks extremely easy to me, and should work.... But is doesn't. Please help?&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 10pt; line-height: 1.5em;"&gt;For the sake of discussion, I have generated the following fictitious data:&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 10pt; line-height: 1.5em;"&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;DATA data;&lt;/P&gt;&lt;P&gt;INPUT President $ Party $ X pf1_20 pf1_40 pf1_60;&lt;/P&gt;&lt;P&gt;DATALINES;&lt;/P&gt;&lt;P&gt;Adams F 2 10 20 30 40&lt;/P&gt;&lt;P&gt;Lincoln R 16 10 20 30 40&lt;/P&gt;&lt;P&gt;Grant R 18 10 20 30 40&lt;/P&gt;&lt;P&gt;Kennedy D 35 10 20 30 40&lt;/P&gt;&lt;P&gt;Adams F 4 10 20 30 40&lt;/P&gt;&lt;P&gt;Lincoln R 17 10 20 30 40&lt;/P&gt;&lt;P&gt;Grant R 22 10 20 30 40&lt;/P&gt;&lt;P&gt;Kennedy D 35 10 20 30 40&lt;/P&gt;&lt;P&gt;Adams F 8 10 20 30 40&lt;/P&gt;&lt;P&gt;Lincoln R 11 10 20 30 40&lt;/P&gt;&lt;P&gt;Grant R 19 10 20 30 40&lt;/P&gt;&lt;P&gt;Kennedy D 40 10 20 30 40&lt;/P&gt;&lt;P&gt;;&lt;/P&gt;&lt;P&gt;RUN;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 29 Mar 2013 12:25:13 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/infinite-do-while-loop/m-p/92246#M19469</guid>
      <dc:creator>Sj03rd</dc:creator>
      <dc:date>2013-03-29T12:25:13Z</dc:date>
    </item>
    <item>
      <title>Re: infinite do-while loop</title>
      <link>https://communities.sas.com/t5/SAS-Programming/infinite-do-while-loop/m-p/92247#M19470</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Maybe you want %DO %WHILE.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;If you don't then you have data step and macro all mixed up.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 29 Mar 2013 13:23:34 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/infinite-do-while-loop/m-p/92247#M19470</guid>
      <dc:creator>data_null__</dc:creator>
      <dc:date>2013-03-29T13:23:34Z</dc:date>
    </item>
    <item>
      <title>Re: infinite do-while loop</title>
      <link>https://communities.sas.com/t5/SAS-Programming/infinite-do-while-loop/m-p/92248#M19471</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;The root of the issue is that macro references are resolved once before the DATA step is compiled. &lt;/P&gt;&lt;P&gt;Your code attempts to change the variables referenced by changing the values of the macro variables.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;This demonstrates the general idea of what I am attempting to describe.&amp;nbsp; The SAS code runs without syntax errors, but there are no guarantees that it is correct.&amp;nbsp; I will leave that to your expertise.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;/* test1.sas */&lt;/P&gt;&lt;P&gt;DATA data;&lt;BR /&gt;INPUT President $ Party $ X pf1_20 pf1_40 pf1_60;&lt;BR /&gt;DATALINES;&lt;BR /&gt;Adams F 2 10 20 30 40&lt;BR /&gt;Lincoln R 16 10 20 30 40&lt;BR /&gt;Grant R 18 10 20 30 40&lt;BR /&gt;Kennedy D 35 10 20 30 40&lt;BR /&gt;Adams F 4 10 20 30 40&lt;BR /&gt;Lincoln R 17 10 20 30 40&lt;BR /&gt;Grant R 22 10 20 30 40&lt;BR /&gt;Kennedy D 35 10 20 30 40&lt;BR /&gt;Adams F 8 10 20 30 40&lt;BR /&gt;Lincoln R 11 10 20 30 40&lt;BR /&gt;Grant R 19 10 20 30 40&lt;BR /&gt;Kennedy D 40 10 20 30 40&lt;BR /&gt;;&lt;BR /&gt;RUN;&lt;BR /&gt;%let startperc1=20;&lt;BR /&gt;%let endperc1=60;&lt;BR /&gt;%let stepperc1=20;&lt;BR /&gt;%let sortingvar1=X;&lt;BR /&gt;%let nowperc=%eval(&amp;amp;startperc1);&lt;BR /&gt;%let prevperc=%eval(&amp;amp;startperc1-&amp;amp;nowperc);&lt;BR /&gt;data newdata;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; set data;&lt;BR /&gt;nowprec = &amp;amp;nowperc;&lt;BR /&gt;prevperc = &amp;amp;prevperc;&lt;BR /&gt;array pf1 (*) pf1_0 pf1_20 pf1_40 pf1_60;&lt;BR /&gt;pf1_0 = 0;&lt;BR /&gt;pnt = 1;&amp;nbsp; /* pointer for pf1 array */&lt;BR /&gt;do while (nowperc lt &amp;amp;endperc1);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; if &amp;amp;sortingvar1&amp;gt;=pf1(pnt) AND &amp;amp;sortingvar1&amp;lt;pf1(pnt + 1) then &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rank = (nowperc - &amp;amp;startperc1 ) / ( &amp;amp;stepperc1 +1);&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR /&gt;&amp;nbsp;&amp;nbsp; nowperc + &amp;amp;stepperc1;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; prevperc + &amp;amp;stepperc1;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; pnt + 1;&lt;BR /&gt;end;&lt;BR /&gt;drop pnt pf1_0;&lt;BR /&gt;run;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Cheers,&lt;/P&gt;&lt;P&gt;Jan&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 29 Mar 2013 15:29:35 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/infinite-do-while-loop/m-p/92248#M19471</guid>
      <dc:creator>jwsquillace</dc:creator>
      <dc:date>2013-03-29T15:29:35Z</dc:date>
    </item>
  </channel>
</rss>

