<?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 Do Loop over the same observation in SAS Procedures</title>
    <link>https://communities.sas.com/t5/SAS-Procedures/Do-Loop-over-the-same-observation/m-p/213030#M52579</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hello!&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I'm trying to make this bit of code more robust:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;TABLE&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;&lt;/TD&gt;&lt;TD&gt;if 99 le days le 182 then&amp;nbsp; visit='6 month'; &lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;/TD&gt;&lt;TD&gt;else if days le ceil(((9*30.5)+14)) then visit='9 month';&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;/TD&gt;&lt;TD&gt;else if days le ceil(((12*30.5)+14)) then visit='12 month';&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;/TD&gt;&lt;TD&gt;else if days le ceil(((15*30.5)+14)) then visit='15 month';&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;/TD&gt;&lt;TD&gt;else if days le ceil(((18*30.5)+14)) then visit='18 month';&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;/TD&gt;&lt;TD&gt;else if days le ceil(((21*30.5)+14)) then visit='21 month';&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;/TD&gt;&lt;TD&gt;else if days le ceil(((24*30.5)+14)) then visit='24 month';&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;/TD&gt;&lt;TD&gt;else if days le ceil(((27*30.5)+14)) then visit='27 month';&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;/TD&gt;&lt;TD&gt;else if days le ceil(((30*30.5)+14)) then visit='30 month';&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;/TD&gt;&lt;TD&gt;else if days le ceil(((33*30.5)+14)) then visit='33 month';&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;/TD&gt;&lt;TD&gt;else if days le ceil(((36*30.5)+14)) then visit='36 month';&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;/TD&gt;&lt;TD&gt;else if days le ceil(((39*30.5)+14)) then visit='39 month';&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;/TD&gt;&lt;TD&gt;else if days le ceil(((42*30.5)+14)) then visit='42 month';&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;/TD&gt;&lt;TD&gt;else if days le ceil(((45*30.5)+14)) then visit='45 month';&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;And have been able to somewhat make it more robust using this method:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;do i=9 by 3 until(last.id);&lt;/P&gt;&lt;P&gt;&amp;nbsp; set origvisits;&lt;/P&gt;&lt;P&gt;&amp;nbsp; days = VISITDTC -trtstdt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; label days='Number of days since original ib1001 start';&lt;/P&gt;&lt;P&gt;&amp;nbsp; if 99 le days le 182 then&amp;nbsp; visit='6 month'; &lt;/P&gt;&lt;P&gt;&amp;nbsp; by id ;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; %let n=i;&lt;/P&gt;&lt;P&gt;&amp;nbsp; if days le ceil(((i*30.5)+14)) then visit=strip(&amp;amp;n||' month');&lt;/P&gt;&lt;P&gt;&amp;nbsp; else if days le ceil((((3+i)*30.5)+14)) then visit=strip(&amp;amp;n+3||' month');&lt;/P&gt;&lt;P&gt;&amp;nbsp; else if days le ceil((((6+i)*30.5)+14)) then visit=strip(&amp;amp;n+6||' month');&lt;/P&gt;&lt;P&gt;&amp;nbsp; else if days le ceil((((9+i)*30.5)+14)) then visit=strip(&amp;amp;n+9||' month');&lt;/P&gt;&lt;P&gt;&amp;nbsp; else if days le ceil((((12+i)*30.5)+14)) then visit=strip(&amp;amp;n+12||' month');&lt;/P&gt;&lt;P&gt;&amp;nbsp; output;&lt;/P&gt;&lt;P&gt;end;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;But its still is not robust enough.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 13.3333330154419px;"&gt;What I've constructed above is each observation is being read in with i=9 and increasing by 3 until last.id. And then i increments sequentially for each observation within that by group (id, in this case)&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 13.3333330154419px;"&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 13.3333330154419px;"&gt;What I really want SAS to do is read one observation at a time and keep trying values of i (the index of the do loop) until the condition &lt;/SPAN&gt;&lt;SPAN style="font-size: 13.3333330154419px;"&gt; if days le ceil(((i*30.5)+14))&amp;nbsp; is true, so that I can assign a nominal visit date. &lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 13.3333330154419px;"&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 13.3333330154419px;"&gt;For example, suppose the condition&amp;nbsp; days le (9*30.5)+14 is not true, I want SAS to stay with that same observation and try (12*30.5)+14, if that condition is not true then try (15*30.5)+14 until the &lt;STRONG&gt;days le (i*30.5)+14&lt;/STRONG&gt; condition is true. Then move on to the next observation in the dataset, with i being reset back to 9.&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 13.3333330154419px;"&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 13.3333330154419px;"&gt;I hope this makes sense, I know what I want SAS to do...but can't quite articulate it.&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 13.3333330154419px;"&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 13.3333330154419px;"&gt;Any help or guidance would be appreciated&lt;BR /&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Mon, 11 May 2015 17:12:38 GMT</pubDate>
    <dc:creator>sahotah</dc:creator>
    <dc:date>2015-05-11T17:12:38Z</dc:date>
    <item>
      <title>Do Loop over the same observation</title>
      <link>https://communities.sas.com/t5/SAS-Procedures/Do-Loop-over-the-same-observation/m-p/213030#M52579</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hello!&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I'm trying to make this bit of code more robust:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;TABLE&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;&lt;/TD&gt;&lt;TD&gt;if 99 le days le 182 then&amp;nbsp; visit='6 month'; &lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;/TD&gt;&lt;TD&gt;else if days le ceil(((9*30.5)+14)) then visit='9 month';&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;/TD&gt;&lt;TD&gt;else if days le ceil(((12*30.5)+14)) then visit='12 month';&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;/TD&gt;&lt;TD&gt;else if days le ceil(((15*30.5)+14)) then visit='15 month';&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;/TD&gt;&lt;TD&gt;else if days le ceil(((18*30.5)+14)) then visit='18 month';&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;/TD&gt;&lt;TD&gt;else if days le ceil(((21*30.5)+14)) then visit='21 month';&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;/TD&gt;&lt;TD&gt;else if days le ceil(((24*30.5)+14)) then visit='24 month';&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;/TD&gt;&lt;TD&gt;else if days le ceil(((27*30.5)+14)) then visit='27 month';&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;/TD&gt;&lt;TD&gt;else if days le ceil(((30*30.5)+14)) then visit='30 month';&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;/TD&gt;&lt;TD&gt;else if days le ceil(((33*30.5)+14)) then visit='33 month';&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;/TD&gt;&lt;TD&gt;else if days le ceil(((36*30.5)+14)) then visit='36 month';&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;/TD&gt;&lt;TD&gt;else if days le ceil(((39*30.5)+14)) then visit='39 month';&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;/TD&gt;&lt;TD&gt;else if days le ceil(((42*30.5)+14)) then visit='42 month';&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;/TD&gt;&lt;TD&gt;else if days le ceil(((45*30.5)+14)) then visit='45 month';&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;And have been able to somewhat make it more robust using this method:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;do i=9 by 3 until(last.id);&lt;/P&gt;&lt;P&gt;&amp;nbsp; set origvisits;&lt;/P&gt;&lt;P&gt;&amp;nbsp; days = VISITDTC -trtstdt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; label days='Number of days since original ib1001 start';&lt;/P&gt;&lt;P&gt;&amp;nbsp; if 99 le days le 182 then&amp;nbsp; visit='6 month'; &lt;/P&gt;&lt;P&gt;&amp;nbsp; by id ;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; %let n=i;&lt;/P&gt;&lt;P&gt;&amp;nbsp; if days le ceil(((i*30.5)+14)) then visit=strip(&amp;amp;n||' month');&lt;/P&gt;&lt;P&gt;&amp;nbsp; else if days le ceil((((3+i)*30.5)+14)) then visit=strip(&amp;amp;n+3||' month');&lt;/P&gt;&lt;P&gt;&amp;nbsp; else if days le ceil((((6+i)*30.5)+14)) then visit=strip(&amp;amp;n+6||' month');&lt;/P&gt;&lt;P&gt;&amp;nbsp; else if days le ceil((((9+i)*30.5)+14)) then visit=strip(&amp;amp;n+9||' month');&lt;/P&gt;&lt;P&gt;&amp;nbsp; else if days le ceil((((12+i)*30.5)+14)) then visit=strip(&amp;amp;n+12||' month');&lt;/P&gt;&lt;P&gt;&amp;nbsp; output;&lt;/P&gt;&lt;P&gt;end;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;But its still is not robust enough.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 13.3333330154419px;"&gt;What I've constructed above is each observation is being read in with i=9 and increasing by 3 until last.id. And then i increments sequentially for each observation within that by group (id, in this case)&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 13.3333330154419px;"&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 13.3333330154419px;"&gt;What I really want SAS to do is read one observation at a time and keep trying values of i (the index of the do loop) until the condition &lt;/SPAN&gt;&lt;SPAN style="font-size: 13.3333330154419px;"&gt; if days le ceil(((i*30.5)+14))&amp;nbsp; is true, so that I can assign a nominal visit date. &lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 13.3333330154419px;"&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 13.3333330154419px;"&gt;For example, suppose the condition&amp;nbsp; days le (9*30.5)+14 is not true, I want SAS to stay with that same observation and try (12*30.5)+14, if that condition is not true then try (15*30.5)+14 until the &lt;STRONG&gt;days le (i*30.5)+14&lt;/STRONG&gt; condition is true. Then move on to the next observation in the dataset, with i being reset back to 9.&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 13.3333330154419px;"&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 13.3333330154419px;"&gt;I hope this makes sense, I know what I want SAS to do...but can't quite articulate it.&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 13.3333330154419px;"&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 13.3333330154419px;"&gt;Any help or guidance would be appreciated&lt;BR /&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 11 May 2015 17:12:38 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Procedures/Do-Loop-over-the-same-observation/m-p/213030#M52579</guid>
      <dc:creator>sahotah</dc:creator>
      <dc:date>2015-05-11T17:12:38Z</dc:date>
    </item>
    <item>
      <title>Re: Do Loop over the same observation</title>
      <link>https://communities.sas.com/t5/SAS-Procedures/Do-Loop-over-the-same-observation/m-p/213031#M52580</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;&lt;SPAN style="font-size: 10pt; line-height: 1.5em;"&gt;The first two groups (6 and 9 months) don't follow the general rule so they have to be coded separately.&amp;nbsp; The others follow a simple rule based on the number of days; this is one way of many to approach it:&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;if 99 le days le 182 then&amp;nbsp; visit=' 6 month';&lt;/P&gt;&lt;P&gt;else if days le ceil(((9*30.5)+14)) then visit=' 9 month';&lt;/P&gt;&lt;P&gt;else do;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; nmon = 3 * ceil((days-14.5) / (3 * 30.5));&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; if nmon le 99 then visit = put(nmon, 2.)!! ' month';&lt;/P&gt;&lt;P&gt;&amp;nbsp; else put 'ERROR: Danger, Will Robinson! Numeric field overflow!';&lt;/P&gt;&lt;P&gt;end;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 11 May 2015 23:49:38 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Procedures/Do-Loop-over-the-same-observation/m-p/213031#M52580</guid>
      <dc:creator>dkb</dc:creator>
      <dc:date>2015-05-11T23:49:38Z</dc:date>
    </item>
    <item>
      <title>Re: Do Loop over the same observation</title>
      <link>https://communities.sas.com/t5/SAS-Procedures/Do-Loop-over-the-same-observation/m-p/213032#M52581</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;&lt;A __default_attr="76150" __jive_macro_name="thread" class="jive_macro jive_macro_thread" href="https://communities.sas.com/"&gt;&lt;/A&gt;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 12 May 2015 01:44:55 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Procedures/Do-Loop-over-the-same-observation/m-p/213032#M52581</guid>
      <dc:creator>Reeza</dc:creator>
      <dc:date>2015-05-12T01:44:55Z</dc:date>
    </item>
    <item>
      <title>Re: Do Loop over the same observation</title>
      <link>https://communities.sas.com/t5/SAS-Procedures/Do-Loop-over-the-same-observation/m-p/213033#M52582</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Thanks Reeza. I hadn't realised the OP was spraying.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 12 May 2015 10:22:27 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Procedures/Do-Loop-over-the-same-observation/m-p/213033#M52582</guid>
      <dc:creator>dkb</dc:creator>
      <dc:date>2015-05-12T10:22:27Z</dc:date>
    </item>
  </channel>
</rss>

