<?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: How do I Loop through rows to calculate lag values until last.ID in SAS Programming</title>
    <link>https://communities.sas.com/t5/SAS-Programming/How-do-I-Loop-through-rows-to-calculate-lag-values-until-last-ID/m-p/831046#M328396</link>
    <description>&lt;P&gt;Adjus next code to the required number of decimal places:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data fees;
  infile datalines truncover;
  informat accountid 3.reportdate date9. old_interest_amt 5.2 
           balance 4. total_fees best4.;
  input accountid ReportDate Old_Interest_Amt Balance Total_Fees;
  format reportdate date9. old_interest_amt 5.2;
datalines;
123 07Mar2022 34.63 2282 39   
123 07Apr2022 18.53 2281 78
456 11May2022 25.7  1337 44
456 10Jun2022 26.94 1411 88
456 11Jul2022 11.21 1464 132
; run;
 
Data want;
set fees;
by AccountID;
retain lag_diff;
if first.AccountID then do;
    lag_diff=0;
    New_Balance = Balance - Total_Fees;
	New_Int_Amt = (0.099 * New_Balance)/12;
	Diff = Old_Interest_Amt - New_Int_Amt;
end;
else do;
	New_Balance = Balance - lag_diff - Total_Fees;
	New_Int_Amt = (0.099 * New_Balance)/12;
	Diff = Old_Interest_Amt - New_Int_Amt;
end;&lt;BR /&gt;output;
lag_diff = diff;
format New_Balance 4. lag_diff New_Int_Amt Diff 5.2 
run;

&lt;/CODE&gt;&lt;/PRE&gt;</description>
    <pubDate>Tue, 30 Aug 2022 07:48:36 GMT</pubDate>
    <dc:creator>Shmuel</dc:creator>
    <dc:date>2022-08-30T07:48:36Z</dc:date>
    <item>
      <title>How do I Loop through rows to calculate lag values until last.ID</title>
      <link>https://communities.sas.com/t5/SAS-Programming/How-do-I-Loop-through-rows-to-calculate-lag-values-until-last-ID/m-p/830807#M328298</link>
      <description>&lt;P&gt;I need to loop through rows of a table and create new variables simultaneously until last.AccountID. Here is an example:&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Existing table - Fees&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;AccountID&amp;nbsp; &amp;nbsp; ReportDate&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Old_Interest_Amt&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Balance.&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Total_Fees&lt;/P&gt;
&lt;P&gt;123&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;07Mar2022.&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 34.63&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 2282&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 39&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;123&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;07Apr2022&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 18.53&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 2281&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 78&lt;/P&gt;
&lt;P&gt;456&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;11May2022&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 25.7&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;1337&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 44&lt;/P&gt;
&lt;P&gt;456&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 10Jun2022&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 26.94&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;1411&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 88&lt;/P&gt;
&lt;P&gt;456&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;11Jul2022&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 11.21&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;1464&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;132&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;For each row until last.AccountID, I'd like to create three new variables - I've listed their formulae below&lt;/P&gt;
&lt;P&gt;New_Balance = Balance - Total_Fees&lt;/P&gt;
&lt;P&gt;New_Int_Amt = (0.099 * New_Balance)/12&lt;/P&gt;
&lt;P&gt;Diff = Old_Interest_Amt - New_Int_Amt&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Once I create above three variables on the first row, I move to the second row and subtract the value under Diff column from the balance and create above three variables again.&amp;nbsp; I then use the diff value from the second row and subtract it from the balance from the third row and create those three variables again. I need to repeat this process until last.AccountID.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;For example, lets consider AccountID 456 - I calculate those three variables on the first row where I get the diff value of 15. I remove 15 from the balance from the second row and calculate those three variables again and this time I get a diff value of 16. I remove 16 from the balance from the third row and create the same variables. I repeat this process till I reach the last transaction for that particular account.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;I've included the code I've tried below where I'm unable to iterate through till the last transaction.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;# I compute those three variables for each account on their first row&lt;/P&gt;
&lt;P&gt;Data have;&lt;/P&gt;
&lt;P&gt;set fees;&lt;/P&gt;
&lt;P&gt;by AccountID;&lt;/P&gt;
&lt;P&gt;if first.AccountID then do;&lt;/P&gt;
&lt;P&gt;New_Balance = Balance - Total_Fees;&lt;/P&gt;
&lt;P&gt;New_Int_Amt = (0.099 * New_Balance)/12;&lt;/P&gt;
&lt;P&gt;Diff = Old_Interest_Amt - New_Int_Amt;&lt;/P&gt;
&lt;P&gt;end;&lt;/P&gt;
&lt;P&gt;lag_diff = lag(Diff);&lt;/P&gt;
&lt;P&gt;run;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;# I try to remove the diff value from the balance in the subsequent rows&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Data have_1;&lt;/P&gt;
&lt;P&gt;set have;&lt;/P&gt;
&lt;P&gt;do until(last.AccountID);&lt;/P&gt;
&lt;P&gt;Balance = Balance - lag_diff;&lt;/P&gt;
&lt;P&gt;New_Balance = Balance - Total_Fees;&lt;/P&gt;
&lt;P&gt;New_Int_Amt = (0.099 * New_Balance)/12;&lt;/P&gt;
&lt;P&gt;Diff = Old_Interest_Amt - New_Int_Amt;&lt;/P&gt;
&lt;P&gt;lag_diff = lag(Diff);&lt;/P&gt;
&lt;P&gt;end;&lt;/P&gt;
&lt;P&gt;run;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Output I want to see :&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;AccountID&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Old_Interest_Amt&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Balance.&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Total_Fees.&amp;nbsp; &amp;nbsp; &amp;nbsp; New_Balance&amp;nbsp; &amp;nbsp; &amp;nbsp; New_Int_Amt.&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Diff&lt;/P&gt;
&lt;P&gt;123&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 34&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 2282&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;39&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 2243&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 18&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;16&lt;/P&gt;
&lt;P&gt;123&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 18&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 2265&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;78&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 2187&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 18&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;0&lt;/P&gt;
&lt;P&gt;456&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 25&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 1337&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;44&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 1293&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 10&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 15&lt;/P&gt;
&lt;P&gt;456&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 26&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 1396&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 88&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 1308&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;10&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;16&lt;/P&gt;
&lt;P&gt;456&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 11&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;1448&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;132&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;1316&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;10&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 1&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;I'd appreciate if someone is able to correct my logic and help me see the output above. Thank you!&lt;/P&gt;</description>
      <pubDate>Mon, 29 Aug 2022 00:21:53 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/How-do-I-Loop-through-rows-to-calculate-lag-values-until-last-ID/m-p/830807#M328298</guid>
      <dc:creator>SASTad</dc:creator>
      <dc:date>2022-08-29T00:21:53Z</dc:date>
    </item>
    <item>
      <title>Re: How do I Loop through rows to calculate lag values until last.ID</title>
      <link>https://communities.sas.com/t5/SAS-Programming/How-do-I-Loop-through-rows-to-calculate-lag-values-until-last-ID/m-p/831046#M328396</link>
      <description>&lt;P&gt;Adjus next code to the required number of decimal places:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data fees;
  infile datalines truncover;
  informat accountid 3.reportdate date9. old_interest_amt 5.2 
           balance 4. total_fees best4.;
  input accountid ReportDate Old_Interest_Amt Balance Total_Fees;
  format reportdate date9. old_interest_amt 5.2;
datalines;
123 07Mar2022 34.63 2282 39   
123 07Apr2022 18.53 2281 78
456 11May2022 25.7  1337 44
456 10Jun2022 26.94 1411 88
456 11Jul2022 11.21 1464 132
; run;
 
Data want;
set fees;
by AccountID;
retain lag_diff;
if first.AccountID then do;
    lag_diff=0;
    New_Balance = Balance - Total_Fees;
	New_Int_Amt = (0.099 * New_Balance)/12;
	Diff = Old_Interest_Amt - New_Int_Amt;
end;
else do;
	New_Balance = Balance - lag_diff - Total_Fees;
	New_Int_Amt = (0.099 * New_Balance)/12;
	Diff = Old_Interest_Amt - New_Int_Amt;
end;&lt;BR /&gt;output;
lag_diff = diff;
format New_Balance 4. lag_diff New_Int_Amt Diff 5.2 
run;

&lt;/CODE&gt;&lt;/PRE&gt;</description>
      <pubDate>Tue, 30 Aug 2022 07:48:36 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/How-do-I-Loop-through-rows-to-calculate-lag-values-until-last-ID/m-p/831046#M328396</guid>
      <dc:creator>Shmuel</dc:creator>
      <dc:date>2022-08-30T07:48:36Z</dc:date>
    </item>
  </channel>
</rss>

