<?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: retain and first. statement in SAS Programming</title>
    <link>https://communities.sas.com/t5/SAS-Programming/retain-and-first-statement/m-p/299594#M63210</link>
    <description>&lt;P&gt;What about ID 1008 where farm_ever is never 1?&lt;/P&gt;
&lt;P&gt;If the LAST value for Farm_ever going to be equal to 0 when it has been 1 in earlier jobnum values?&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;This may get close to the duration depending on responses to those questions.&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data want ;
     set jobhist ;
     by id jobnum farm_ever ;
     retain start ;
     if first.id then start= -999;
     if farm_ever=1 and start=-999 then start=startyear;
     else if farm_ever=0 then start=-999;
     if last.id and start ne -999 then duration = endyear-start; 
run ;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;BTW I recommend extreme caution with the&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Data Jobhist;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp; set Jobhist;&lt;/P&gt;
&lt;P&gt;code. It is entirely too easy to end up with bad data if you recode any of your original variables. Multiple passes can recode multiple times.&lt;/P&gt;</description>
    <pubDate>Tue, 20 Sep 2016 16:15:21 GMT</pubDate>
    <dc:creator>ballardw</dc:creator>
    <dc:date>2016-09-20T16:15:21Z</dc:date>
    <item>
      <title>retain and first. statement</title>
      <link>https://communities.sas.com/t5/SAS-Programming/retain-and-first-statement/m-p/299587#M63206</link>
      <description>&lt;P&gt;I've never expected the difficulty to perform a simple procuders with retain and first. statement.&lt;/P&gt;&lt;P&gt;My data look like this:&lt;/P&gt;&lt;TABLE&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;id&lt;/TD&gt;&lt;TD&gt;jobnum&lt;/TD&gt;&lt;TD&gt;farm_ever&lt;/TD&gt;&lt;TD&gt;startyear&lt;/TD&gt;&lt;TD&gt;endyear&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;1004&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;1955&lt;/TD&gt;&lt;TD&gt;1959&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;1004&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;1959&lt;/TD&gt;&lt;TD&gt;1962&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;1004&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;1962&lt;/TD&gt;&lt;TD&gt;1977&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;1008&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;1951&lt;/TD&gt;&lt;TD&gt;1978&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;1008&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;1978&lt;/TD&gt;&lt;TD&gt;1981&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;1011&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;1954&lt;/TD&gt;&lt;TD&gt;1998&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;1012&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;1965&lt;/TD&gt;&lt;TD&gt;1966&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;1012&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;1966&lt;/TD&gt;&lt;TD&gt;1968&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;1012&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;1968&lt;/TD&gt;&lt;TD&gt;1972&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;1012&lt;/TD&gt;&lt;TD&gt;4&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;1972&lt;/TD&gt;&lt;TD&gt;1975&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;1012&lt;/TD&gt;&lt;TD&gt;5&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;1975&lt;/TD&gt;&lt;TD&gt;2000&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;1014&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;1959&lt;/TD&gt;&lt;TD&gt;1963&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;1014&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;1963&lt;/TD&gt;&lt;TD&gt;1965&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;1014&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;1965&lt;/TD&gt;&lt;TD&gt;1967&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;1014&lt;/TD&gt;&lt;TD&gt;4&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;1967&lt;/TD&gt;&lt;TD&gt;1970&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;1014&lt;/TD&gt;&lt;TD&gt;5&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;1970&lt;/TD&gt;&lt;TD&gt;1977&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;1014&lt;/TD&gt;&lt;TD&gt;6&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;1978&lt;/TD&gt;&lt;TD&gt;1998&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;1014&lt;/TD&gt;&lt;TD&gt;7&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;1998&lt;/TD&gt;&lt;TD&gt;1999&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;I need to calculate duration (endyear - startyear) when farm_ever = 1. When farm_ever = 1 continuously, I need duration across all jobnum. For example, when id=1014, farm_ever = 1 at jobnum 4, 5, 6, 7, the duration should be 1999-1967. I tried to use retain and first. statement :&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;proc sort data = jobhist ; by id jobnum farm_ever ; run ;&lt;/P&gt;&lt;P&gt;data jobhist ;&lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;set jobhist ;&lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;by id jobnum farm_ever ;&lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;retain start ;&lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;if first.farm_ever then start = startyear ;&lt;BR /&gt;run ;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;But the results did not get retained because first.farm_ever is 1 for every entry. Then I tries proc sort without jobnum, but when farm_ever = 0, it went up to first, then the wrong year got retained.&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Could anyone please help me out? Is there any function to fix this, or is there any other statement to do this apart from retain?&amp;nbsp;&lt;/P&gt;&lt;P&gt;Thank you so much!&lt;/P&gt;</description>
      <pubDate>Tue, 20 Sep 2016 15:43:32 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/retain-and-first-statement/m-p/299587#M63206</guid>
      <dc:creator>Tibby</dc:creator>
      <dc:date>2016-09-20T15:43:32Z</dc:date>
    </item>
    <item>
      <title>Re: retain and first. statement</title>
      <link>https://communities.sas.com/t5/SAS-Programming/retain-and-first-statement/m-p/299591#M63209</link>
      <description>&lt;P&gt;The sorted order is correct.&amp;nbsp; RETAIN is also correct.&amp;nbsp; Here's how&amp;nbsp; you might add to those pieces:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;data want;&lt;/P&gt;
&lt;P&gt;set jobhist;&lt;/P&gt;
&lt;P&gt;by id farm_ever notsorted;&lt;/P&gt;
&lt;P&gt;retain start;&lt;/P&gt;
&lt;P&gt;if farm_ever=1 then do;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp; if first.farm_ever then start = startyear;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp; if last.farm_ever then duration = endyear - start;&lt;/P&gt;
&lt;P&gt;end;&lt;/P&gt;
&lt;P&gt;drop start;&lt;/P&gt;
&lt;P&gt;run;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;NOTSORTED permits the BY statement, even though the data are not in order by FARM_EVER.&amp;nbsp; You can see how the program utilizes first. and last. from that point.&lt;/P&gt;</description>
      <pubDate>Tue, 20 Sep 2016 16:05:55 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/retain-and-first-statement/m-p/299591#M63209</guid>
      <dc:creator>Astounding</dc:creator>
      <dc:date>2016-09-20T16:05:55Z</dc:date>
    </item>
    <item>
      <title>Re: retain and first. statement</title>
      <link>https://communities.sas.com/t5/SAS-Programming/retain-and-first-statement/m-p/299594#M63210</link>
      <description>&lt;P&gt;What about ID 1008 where farm_ever is never 1?&lt;/P&gt;
&lt;P&gt;If the LAST value for Farm_ever going to be equal to 0 when it has been 1 in earlier jobnum values?&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;This may get close to the duration depending on responses to those questions.&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data want ;
     set jobhist ;
     by id jobnum farm_ever ;
     retain start ;
     if first.id then start= -999;
     if farm_ever=1 and start=-999 then start=startyear;
     else if farm_ever=0 then start=-999;
     if last.id and start ne -999 then duration = endyear-start; 
run ;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;BTW I recommend extreme caution with the&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Data Jobhist;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp; set Jobhist;&lt;/P&gt;
&lt;P&gt;code. It is entirely too easy to end up with bad data if you recode any of your original variables. Multiple passes can recode multiple times.&lt;/P&gt;</description>
      <pubDate>Tue, 20 Sep 2016 16:15:21 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/retain-and-first-statement/m-p/299594#M63210</guid>
      <dc:creator>ballardw</dc:creator>
      <dc:date>2016-09-20T16:15:21Z</dc:date>
    </item>
    <item>
      <title>Re: retain and first. statement</title>
      <link>https://communities.sas.com/t5/SAS-Programming/retain-and-first-statement/m-p/299614#M63223</link>
      <description>Thank you so much for your help and for explaining notsorted. It worked just as the way I wanted.</description>
      <pubDate>Tue, 20 Sep 2016 17:04:50 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/retain-and-first-statement/m-p/299614#M63223</guid>
      <dc:creator>Tibby</dc:creator>
      <dc:date>2016-09-20T17:04:50Z</dc:date>
    </item>
    <item>
      <title>Re: retain and first. statement</title>
      <link>https://communities.sas.com/t5/SAS-Programming/retain-and-first-statement/m-p/299615#M63224</link>
      <description>&lt;P&gt;Thank you for your suggestion about data jobhist; set jobhist; I'll be more careful of using it.&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;If for ID 1008 that farm_ever has never been 1, then no need to deal with it. The tricky part is to that&lt;SPAN&gt;&amp;nbsp;LAST value for Farm_ever going to be equal to 0 when it has been 1 in earlier jobnum values.&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;The code you provided did pretty much most of the calculation but some tricky ones were missed. It was pretty close, though. Thank you for sharing your insight!&lt;/SPAN&gt;&lt;/P&gt;</description>
      <pubDate>Tue, 20 Sep 2016 17:09:28 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/retain-and-first-statement/m-p/299615#M63224</guid>
      <dc:creator>Tibby</dc:creator>
      <dc:date>2016-09-20T17:09:28Z</dc:date>
    </item>
  </channel>
</rss>

