<?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: Lag function applied to a set of IDs in SAS Data Management</title>
    <link>https://communities.sas.com/t5/SAS-Data-Management/Lag-function-applied-to-a-set-of-IDs/m-p/599842#M18298</link>
    <description>&lt;P&gt;Thank you I fixed my question and reposted it with the code.&lt;/P&gt;&lt;P&gt;Sorting is fine its just the if statement that I need help with, How do I tell SAS to stop at each set of ID2.&lt;/P&gt;</description>
    <pubDate>Mon, 28 Oct 2019 15:37:32 GMT</pubDate>
    <dc:creator>AZIQ1</dc:creator>
    <dc:date>2019-10-28T15:37:32Z</dc:date>
    <item>
      <title>Lag function applied to a set of IDs</title>
      <link>https://communities.sas.com/t5/SAS-Data-Management/Lag-function-applied-to-a-set-of-IDs/m-p/599831#M18296</link>
      <description>&lt;P&gt;data have;&lt;BR /&gt;input ID1 ID2 R I Seq ;&lt;BR /&gt;datalines;&lt;BR /&gt;1 11 1 . 1&lt;BR /&gt;2 11 0 1 2&lt;BR /&gt;1 143 0 1 1&lt;BR /&gt;1 22 1 . 1&lt;BR /&gt;2 22 1 . 2&lt;BR /&gt;3 22 1 . 1&lt;BR /&gt;4 22 1 . 2&lt;BR /&gt;1 165 0 1 1&lt;BR /&gt;1 164 0 1 1&lt;BR /&gt;1 166 0 1 1&lt;BR /&gt;1 33 0 1 1&lt;BR /&gt;2 33 1 . 2&lt;BR /&gt;3 33 1 . 3&lt;BR /&gt;4 33 1 . 4&lt;BR /&gt;;&lt;/P&gt;&lt;P&gt;proc sort data = have;&lt;BR /&gt;by ID2;&lt;BR /&gt;run;&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;data want;&lt;BR /&gt;set have;&lt;BR /&gt;by ID2;&lt;BR /&gt;if I = 1 and lag(R) =1 the Rnew = 1;&lt;BR /&gt;Else Rnew = 0;&lt;BR /&gt;run;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Want&lt;/P&gt;&lt;P&gt;To create a new field called Rnew where if I = 1 then Rnew = Lag(R)&amp;nbsp;&lt;/P&gt;&lt;P&gt;I sorted the data by ID2 so that this rule applies to only ID2 and changes everytime ID2 changes - but its not working&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;For ID2 = 11 SAS is reading the R field for the next ID2&amp;nbsp; (143) and ignoring the lag function and shows RNew = 1 when infact it should be 0;&lt;/P&gt;&lt;P&gt;Any ideas what am I doing incorrect and how do I tell SAS to apply this rule for a set of IDs only.&lt;/P&gt;&lt;P&gt;Thanks&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;WANT&lt;/P&gt;&lt;TABLE border="0" cellspacing="0" cellpadding="0"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;ID1&lt;/TD&gt;&lt;TD&gt;ID2&lt;/TD&gt;&lt;TD&gt;R&lt;/TD&gt;&lt;TD&gt;I&lt;/TD&gt;&lt;TD&gt;Seq&lt;/TD&gt;&lt;TD&gt;Rnew&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;11&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;11&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;22&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;22&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;22&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;4&lt;/TD&gt;&lt;TD&gt;22&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;33&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;33&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;33&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;4&lt;/TD&gt;&lt;TD&gt;33&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;4&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;143&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;164&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;165&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;166&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;</description>
      <pubDate>Mon, 28 Oct 2019 15:48:25 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Data-Management/Lag-function-applied-to-a-set-of-IDs/m-p/599831#M18296</guid>
      <dc:creator>AZIQ1</dc:creator>
      <dc:date>2019-10-28T15:48:25Z</dc:date>
    </item>
    <item>
      <title>Re: Lag function applied to a set of IDs</title>
      <link>https://communities.sas.com/t5/SAS-Data-Management/Lag-function-applied-to-a-set-of-IDs/m-p/599834#M18297</link>
      <description>&lt;P&gt;Is that "want" data show the result of your code? You "want" code has at least one error:&lt;/P&gt;
&lt;PRE&gt;by ID2 and seq;
&lt;/PRE&gt;
&lt;P&gt;AS the variable AND on your BY statement does not exist in the shown HAVE data set.&lt;/P&gt;
&lt;P&gt;Second, without the "and" you will get an error of&lt;/P&gt;
&lt;PRE&gt;ERROR: BY variables are not properly sorted on data set USER.HAVE.
&lt;/PRE&gt;
&lt;P&gt;So, please provide your example data in the form of a data step that will run to create your Have data such as.&lt;/P&gt;
&lt;PRE&gt;data have;
input ID1 ID2 R I Seq ;
datalines;
1 11 1 .  1 
2 11 0 1 2 
1 143 0 1 1 
1 22 1  . 1 
2 22 1 .  2 
3 22 1 .  1 
4 22 1 .  2 
1 165 0 1 1 
1 164 0 1 1 
1 166 0 1 1 
1 33 0 1 1 
2 33 1 .  3 
3 33 1 .  4 
4 33 1 .  2 
;
&lt;/PRE&gt;
&lt;P&gt;plus the actual code used to sort the data as your shown "want" data set does not show data sorted by Id2 Seq.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;And a similar data set to show the desired result.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Mon, 28 Oct 2019 15:15:07 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Data-Management/Lag-function-applied-to-a-set-of-IDs/m-p/599834#M18297</guid>
      <dc:creator>ballardw</dc:creator>
      <dc:date>2019-10-28T15:15:07Z</dc:date>
    </item>
    <item>
      <title>Re: Lag function applied to a set of IDs</title>
      <link>https://communities.sas.com/t5/SAS-Data-Management/Lag-function-applied-to-a-set-of-IDs/m-p/599842#M18298</link>
      <description>&lt;P&gt;Thank you I fixed my question and reposted it with the code.&lt;/P&gt;&lt;P&gt;Sorting is fine its just the if statement that I need help with, How do I tell SAS to stop at each set of ID2.&lt;/P&gt;</description>
      <pubDate>Mon, 28 Oct 2019 15:37:32 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Data-Management/Lag-function-applied-to-a-set-of-IDs/m-p/599842#M18298</guid>
      <dc:creator>AZIQ1</dc:creator>
      <dc:date>2019-10-28T15:37:32Z</dc:date>
    </item>
    <item>
      <title>Re: Lag function applied to a set of IDs</title>
      <link>https://communities.sas.com/t5/SAS-Data-Management/Lag-function-applied-to-a-set-of-IDs/m-p/599912#M18299</link>
      <description>&lt;P&gt;Does your reporting of data set WANT really represent your desired output?&amp;nbsp; I ask because it does not meet my understanding of your requirement.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;I suggest:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data have;
input ID1 ID2 R I Seq ;
datalines;
1 11 1 . 1
2 11 0 1 2
1 143 0 1 1
1 22 1 . 1
2 22 1 . 2
3 22 1 . 1
4 22 1 . 2
1 165 0 1 1
1 164 0 1 1
1 166 0 1 1
1 33 0 1 1
2 33 1 . 2
3 33 1 . 3
4 33 1 . 4
;
proc sort data = have;
  by ID2;
run;
data want;
  set have;
  by ID2;
  rnew=ifn(i=1 and first.id2=0,lag(r),0);
run;
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;The statement&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;rnew=ifn(i=1 and first.id2=0,lag(r),0);&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;probably produces the result you describe, while the code you provide:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;if I = 1 and lag(R) =1 then Rnew = 1;
Else Rnew = 0;
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;probably does not. &amp;nbsp; That's for two reasons:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;&amp;nbsp;By testing for first.id2=0 I am allowing lag(R) to be a possible result only when the record-in-hand is not the start of an ID2 group.&lt;/LI&gt;
&lt;LI&gt;&amp;nbsp;But even if you had only one ID2 group, you would get erroneous results.&amp;nbsp; That's because the lag function is really a queue-updater&amp;nbsp; (a LIFO queue).&amp;nbsp; If you put that queue updater function as the result of the IF condition, then the queue is not updated with every observation.&amp;nbsp; And therefore the lagged result will return the value of R not from the prior observations, but from the prior observation that satisfied the "IF I=1" condition.&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;What you probably want is to update the queue with every observation, but return that update to the RNEW result only when the if condition is met. &amp;nbsp; Unlike the IF … THEN … statement, the IFN function always updates both of the possible results (i.e. both LAG(r) and 0).&amp;nbsp; And it returns LAG(r) when I=1 and first.ID2=0,&amp;nbsp; and returns zero otherwise. &amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Whenever I see or use the LAG function, in my mind I substitute the term UFQ&amp;nbsp; (update-fifo-queue), which I find to be a useful way to recognize what the function is actually doing.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Also:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;BTW, it looks like your dataset HAVE is already grouped by ID2, even though it is not SORTED by ID2, you could avoid the PROC SORT.&amp;nbsp; Just change the "BY ID2" statement to "BY ID2 NOTSORTED".&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Mon, 28 Oct 2019 19:12:49 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Data-Management/Lag-function-applied-to-a-set-of-IDs/m-p/599912#M18299</guid>
      <dc:creator>mkeintz</dc:creator>
      <dc:date>2019-10-28T19:12:49Z</dc:date>
    </item>
  </channel>
</rss>

