<?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: Get t-1, t , t+1, t+2,...,t+n value from the same table as new fields. in SAS Programming</title>
    <link>https://communities.sas.com/t5/SAS-Programming/Get-t-1-t-t-1-t-2-t-n-value-from-the-same-table-as-new-fields/m-p/536376#M147398</link>
    <description>&lt;P&gt;Although transposing the data and getting rid of data in variable names, as suggested by&amp;nbsp;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/11562"&gt;@Kurt_Bremser&lt;/a&gt;, is the recommended why to solve the problem, your could skip transposing:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data work.have;
   length id $ 3 active_dt 8 
      avgbal_201804 avgbal_201805 avgbal_201806 avgbal_201807 avgbal_201808 avgbal_201809 
      avgbal_201810 avgbal_201811 avgbal_201812 avgbal_201901 avgbal_201902 8
   ;

   input id active_dt avgbal_201804 avgbal_201805 avgbal_201806 avgbal_201807 avgbal_201808 avgbal_201809 
      avgbal_201810 avgbal_201811 avgbal_201812 avgbal_201901 avgbal_201902;
   datalines;
001 201807 5000 5300 . . . . . . . . 7000
002 201901 3200 3000 . . . . . . . . 4500
;
run;


/* Get the names of avgval-variables */
proc sql noprint;
   select Name
      into :avgList separated by '#'
      from sashelp.vcolumn
         where LibName = 'WORK' and MemName = 'HAVE' and Name like 'avgbal%'
   ;
quit;

/* to distinguish between missing data and missing variable and to format both according to specification */ 
proc format;
   value avgbal
      LOW-HIGH = [best32.]
      . = 'XXXX' /* data is missing in value */
      .v = ' ' /* variable is missing */
   ;
run;


data work.want;
   set work.have;

   length 
      avgbal_minus3 avgbal_minus2 avgbal_minus1 avgbal_plus1 avgbal_plus2 avgbal_plus3 8
      active_date i dummy 8
      varname $ 32 
   ;

   keep id active_dt avgbal_minus3 avgbal_minus2 avgbal_minus1 avgbal_plus1 avgbal_plus2 avgbal_plus3;

   /*  dummy is required to get a continuous array */
   retain dummy 0;

   format active_date yymmn6.;

   array targets[-3:3] avgbal_minus3 avgbal_minus2 avgbal_minus1 dummy avgbal_plus1 avgbal_plus2 avgbal_plus3;

   active_date = input(cats(active_dt, '01'), yymmdd8.);
   
   do i = -3 to 3;
      if i ^= 0 then do;
         varname = cats('avgbal_', put(intnx('month', active_date, i), yymmn6.));

         if findw("&amp;amp;avgList.", varname, '#', 'it') then do;
            targets[i] = vvaluex(varname);
         end;
         else do;
            targets[i] = .v;
         end;
      end;
   end;

run;


proc print data=work.want;
   format avgbal: avgbal.;
run;&lt;/CODE&gt;&lt;/PRE&gt;</description>
    <pubDate>Mon, 18 Feb 2019 07:38:07 GMT</pubDate>
    <dc:creator>andreas_lds</dc:creator>
    <dc:date>2019-02-18T07:38:07Z</dc:date>
    <item>
      <title>Get t-1, t , t+1, t+2,...,t+n value from the same table as new fields.</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Get-t-1-t-t-1-t-2-t-n-value-from-the-same-table-as-new-fields/m-p/536361#M147394</link>
      <description>&lt;P&gt;Hi, I dont know how to describe in the subject but here is what I'm struggling now.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;So I have this big table (24 months average balance (see below sample)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE&gt;id |active_dt|avgbal_201804|avgbal_201805|.........|avgbal_201902
001|   201807|         5000|         5300|.........|         7000
002|   201901|         3200|         3000|.........|         4500&lt;/PRE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;I need to get avgbal of 3 months before and 3 months after from the active_dt&lt;/P&gt;&lt;P&gt;The new fields name are avgbal_minus3, avgbal_minus2, avgbal_minus1, avgbal_plus1, avgbal_plus2, avgbal_plus3&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;id 001 should have&lt;/P&gt;&lt;P&gt;avgbal_minus3= take from avgbal_201804&lt;/P&gt;&lt;P&gt;avgbal_minus2= take from avgbal_201805&lt;/P&gt;&lt;P&gt;avgbal_minus1= take from avgbal_201806&lt;/P&gt;&lt;P&gt;avgbal_plus1= take from avgbal_201808&lt;/P&gt;&lt;P&gt;avgbal_plus2= take from avgbal_201809&lt;/P&gt;&lt;P&gt;avgbal_plus3= take from avgbal_201810&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;while id 002 will take from avgbal_201810, avgbal_201811, avgbal_201812 and avgbal_201902 (this id will have blank avgbal_plus2 and avgbal_plus3 since the data only up to February.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;The final table should look like below&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE&gt;id |active_dt|avgbal_minus3|avgbal_minus2|avgbal_minus1|avgbal_plus1|avgbal_plus2|avgbal_plus3|&lt;BR /&gt;001|   201807|         5000|         5300|         XXXX|        XXXX|        XXXX|        XXXX|&lt;BR /&gt;002|   201901|         XXXX|         XXXX|         XXXX|        4500|            |            |&lt;/PRE&gt;&lt;P&gt;Please help&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Thanks&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Mon, 18 Feb 2019 06:53:26 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Get-t-1-t-t-1-t-2-t-n-value-from-the-same-table-as-new-fields/m-p/536361#M147394</guid>
      <dc:creator>dearkyr</dc:creator>
      <dc:date>2019-02-18T06:53:26Z</dc:date>
    </item>
    <item>
      <title>Re: Get t-1, t , t+1, t+2,...,t+n value from the same table as new fields.</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Get-t-1-t-t-1-t-2-t-n-value-from-the-same-table-as-new-fields/m-p/536371#M147396</link>
      <description>&lt;P&gt;First, transpose the data to a long format where you have id, active_dt, balance_dt (derived form the avgbal variable names) and balance.&lt;/P&gt;
&lt;P&gt;You can then retrieve the balance grouped by id and active_dt:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data have;
infile datalines dlm='|';
input id active_dt :yymmn6. avgbal_201804 avgbal_201805 avgbal_201806 avgbal_201807 avgbal_201808 avgbal_201809 avgbal_201810 avgbal_201811 avgbal_201812 avgbal_201901 avgbal_201902;
format active_dt yymmddd10.;
datalines;
001|201807|5000|5300|5500|5600|5700|5800|5900|6000|6200|6500|7000
;
run;

proc transpose data=have out=trans;
by id active_dt;
var avgbal:;
run;

data trans2;
set trans;
balance_dt = input(scan(_name_,2,'_'),yymmn6.);
format balance_dt yymmddd10.;
drop _name_;
rename col1=avg_balance;
run;

data want;
set trans2;
by id active_dt;
retain avgbal_minus3 avgbal_minus2 avgbal_minus1 avgbal_plus1 avgbal_plus2 avgbal_plus3;
array balances_minus {3} avgbal_minus1-avgbal_minus3;
array balances_plus {3} avgbal_plus1-avgbal_plus3;
if first.active_dt
then do i = 1 to 3;
  balances_minus{i} = .;
  balances_plus{i} = .;
end;
do i = 1 to 3;
  if intck('month',active_dt,balance_dt) = i then balances_plus{i} = avg_balance;
  if intck('month',balance_dt,active_dt) = i then balances_minus{i} = avg_balance;
end;
if last.active_dt then output;
keep id active_dt avgbal_minus: avgbal_plus:;
run;
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;Note that a "long" dataset format without data (dates in your case) in structure (variable names) is always easier to code against.&lt;/P&gt;
&lt;P&gt;See Maxims 19 &amp;amp; 33.&lt;/P&gt;</description>
      <pubDate>Mon, 18 Feb 2019 07:30:27 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Get-t-1-t-t-1-t-2-t-n-value-from-the-same-table-as-new-fields/m-p/536371#M147396</guid>
      <dc:creator>Kurt_Bremser</dc:creator>
      <dc:date>2019-02-18T07:30:27Z</dc:date>
    </item>
    <item>
      <title>Re: Get t-1, t , t+1, t+2,...,t+n value from the same table as new fields.</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Get-t-1-t-t-1-t-2-t-n-value-from-the-same-table-as-new-fields/m-p/536376#M147398</link>
      <description>&lt;P&gt;Although transposing the data and getting rid of data in variable names, as suggested by&amp;nbsp;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/11562"&gt;@Kurt_Bremser&lt;/a&gt;, is the recommended why to solve the problem, your could skip transposing:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data work.have;
   length id $ 3 active_dt 8 
      avgbal_201804 avgbal_201805 avgbal_201806 avgbal_201807 avgbal_201808 avgbal_201809 
      avgbal_201810 avgbal_201811 avgbal_201812 avgbal_201901 avgbal_201902 8
   ;

   input id active_dt avgbal_201804 avgbal_201805 avgbal_201806 avgbal_201807 avgbal_201808 avgbal_201809 
      avgbal_201810 avgbal_201811 avgbal_201812 avgbal_201901 avgbal_201902;
   datalines;
001 201807 5000 5300 . . . . . . . . 7000
002 201901 3200 3000 . . . . . . . . 4500
;
run;


/* Get the names of avgval-variables */
proc sql noprint;
   select Name
      into :avgList separated by '#'
      from sashelp.vcolumn
         where LibName = 'WORK' and MemName = 'HAVE' and Name like 'avgbal%'
   ;
quit;

/* to distinguish between missing data and missing variable and to format both according to specification */ 
proc format;
   value avgbal
      LOW-HIGH = [best32.]
      . = 'XXXX' /* data is missing in value */
      .v = ' ' /* variable is missing */
   ;
run;


data work.want;
   set work.have;

   length 
      avgbal_minus3 avgbal_minus2 avgbal_minus1 avgbal_plus1 avgbal_plus2 avgbal_plus3 8
      active_date i dummy 8
      varname $ 32 
   ;

   keep id active_dt avgbal_minus3 avgbal_minus2 avgbal_minus1 avgbal_plus1 avgbal_plus2 avgbal_plus3;

   /*  dummy is required to get a continuous array */
   retain dummy 0;

   format active_date yymmn6.;

   array targets[-3:3] avgbal_minus3 avgbal_minus2 avgbal_minus1 dummy avgbal_plus1 avgbal_plus2 avgbal_plus3;

   active_date = input(cats(active_dt, '01'), yymmdd8.);
   
   do i = -3 to 3;
      if i ^= 0 then do;
         varname = cats('avgbal_', put(intnx('month', active_date, i), yymmn6.));

         if findw("&amp;amp;avgList.", varname, '#', 'it') then do;
            targets[i] = vvaluex(varname);
         end;
         else do;
            targets[i] = .v;
         end;
      end;
   end;

run;


proc print data=work.want;
   format avgbal: avgbal.;
run;&lt;/CODE&gt;&lt;/PRE&gt;</description>
      <pubDate>Mon, 18 Feb 2019 07:38:07 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Get-t-1-t-t-1-t-2-t-n-value-from-the-same-table-as-new-fields/m-p/536376#M147398</guid>
      <dc:creator>andreas_lds</dc:creator>
      <dc:date>2019-02-18T07:38:07Z</dc:date>
    </item>
    <item>
      <title>Re: Get t-1, t , t+1, t+2,...,t+n value from the same table as new fields.</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Get-t-1-t-t-1-t-2-t-n-value-from-the-same-table-as-new-fields/m-p/536393#M147403</link>
      <description>&lt;P&gt;I keep getting V as the value. Do I miss something here?&lt;/P&gt;&lt;P&gt;Thanks&lt;/P&gt;</description>
      <pubDate>Mon, 18 Feb 2019 08:56:14 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Get-t-1-t-t-1-t-2-t-n-value-from-the-same-table-as-new-fields/m-p/536393#M147403</guid>
      <dc:creator>dearkyr</dc:creator>
      <dc:date>2019-02-18T08:56:14Z</dc:date>
    </item>
    <item>
      <title>Re: Get t-1, t , t+1, t+2,...,t+n value from the same table as new fields.</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Get-t-1-t-t-1-t-2-t-n-value-from-the-same-table-as-new-fields/m-p/536396#M147404</link>
      <description>&lt;P&gt;Run &lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/15475"&gt;@andreas_lds&lt;/a&gt;' code AS IS, and you'll get this result:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="margin-bottom: 0cm; line-height: 100%;"&gt;&amp;nbsp;&lt;/P&gt;
&lt;TABLE width="692" cellspacing="0" cellpadding="2"&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD style="border: none; padding: 0cm;" width="688"&gt;
&lt;TABLE width="100%" cellspacing="0" cellpadding="2"&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD style="border: none; padding: 0cm;" width="100%"&gt;
&lt;TABLE width="100%" cellspacing="0" cellpadding="2"&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD style="border: none; padding: 0cm;" width="100%"&gt;
&lt;TABLE width="100%" cellspacing="0" cellpadding="2"&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD style="border: none; padding: 0cm;" width="100%"&gt;
&lt;P align="center"&gt;Energy&amp;nbsp;Expenditures&amp;nbsp;for&amp;nbsp;Each&amp;nbsp;Region&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD style="border: none; padding: 0cm;" width="100%"&gt;
&lt;P align="center"&gt;(millions&amp;nbsp;of&amp;nbsp;dollars)&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;/TBODY&gt;
&lt;/TABLE&gt;
&lt;TABLE width="100%" cellspacing="0" cellpadding="2"&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TH style="border: none; padding: 0cm;" width="100%"&gt;&lt;CENTER&gt;
&lt;TABLE width="677" cellspacing="0" cellpadding="0"&gt;
&lt;THEAD&gt;
&lt;TR&gt;
&lt;TH style="border: none; padding: 0cm;" width="54"&gt;
&lt;P align="right"&gt;Beob.&lt;/P&gt;
&lt;/TH&gt;
&lt;TH style="border: none; padding: 0cm;" width="33"&gt;
&lt;P align="left"&gt;id&lt;/P&gt;
&lt;/TH&gt;
&lt;TH style="border: none; padding: 0cm;" width="71"&gt;
&lt;P align="right"&gt;active_dt&lt;/P&gt;
&lt;/TH&gt;
&lt;TH style="border: none; padding: 0cm;" width="88"&gt;
&lt;P align="right"&gt;avgbal_minus3&lt;/P&gt;
&lt;/TH&gt;
&lt;TH style="border: none; padding: 0cm;" width="88"&gt;
&lt;P align="right"&gt;avgbal_minus2&lt;/P&gt;
&lt;/TH&gt;
&lt;TH style="border: none; padding: 0cm;" width="88"&gt;
&lt;P align="right"&gt;avgbal_minus1&lt;/P&gt;
&lt;/TH&gt;
&lt;TH style="border: none; padding: 0cm;" width="84"&gt;
&lt;P align="right"&gt;avgbal_plus1&lt;/P&gt;
&lt;/TH&gt;
&lt;TH style="border: none; padding: 0cm;" width="84"&gt;
&lt;P align="right"&gt;avgbal_plus2&lt;/P&gt;
&lt;/TH&gt;
&lt;TH style="border: none; padding: 0cm;" width="86"&gt;
&lt;P align="right"&gt;avgbal_plus3&lt;/P&gt;
&lt;/TH&gt;
&lt;/TR&gt;
&lt;/THEAD&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD style="border: none; padding: 0cm;" width="54"&gt;
&lt;P align="right"&gt;1&lt;/P&gt;
&lt;/TD&gt;
&lt;TD style="border: none; padding: 0cm;" width="33"&gt;
&lt;P align="left"&gt;001&lt;/P&gt;
&lt;/TD&gt;
&lt;TD style="border: none; padding: 0cm;" width="71"&gt;
&lt;P align="right"&gt;201807&lt;/P&gt;
&lt;/TD&gt;
&lt;TD style="border: none; padding: 0cm;" width="88"&gt;
&lt;P align="right"&gt;5000&lt;/P&gt;
&lt;/TD&gt;
&lt;TD style="border: none; padding: 0cm;" width="88"&gt;
&lt;P align="right"&gt;5300&lt;/P&gt;
&lt;/TD&gt;
&lt;TD style="border: none; padding: 0cm;" width="88"&gt;
&lt;P align="right"&gt;XXXX&lt;/P&gt;
&lt;/TD&gt;
&lt;TD style="border: none; padding: 0cm;" width="84"&gt;
&lt;P align="right"&gt;XXXX&lt;/P&gt;
&lt;/TD&gt;
&lt;TD style="border: none; padding: 0cm;" width="84"&gt;
&lt;P align="right"&gt;XXXX&lt;/P&gt;
&lt;/TD&gt;
&lt;TD style="border: none; padding: 0cm;" width="86"&gt;
&lt;P align="right"&gt;XXXX&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD style="border: none; padding: 0cm;" width="54"&gt;
&lt;P align="right"&gt;2&lt;/P&gt;
&lt;/TD&gt;
&lt;TD style="border: none; padding: 0cm;" width="33"&gt;
&lt;P align="left"&gt;002&lt;/P&gt;
&lt;/TD&gt;
&lt;TD style="border: none; padding: 0cm;" width="71"&gt;
&lt;P align="right"&gt;201901&lt;/P&gt;
&lt;/TD&gt;
&lt;TD style="border: none; padding: 0cm;" width="88"&gt;
&lt;P align="right"&gt;XXXX&lt;/P&gt;
&lt;/TD&gt;
&lt;TD style="border: none; padding: 0cm;" width="88"&gt;
&lt;P align="right"&gt;XXXX&lt;/P&gt;
&lt;/TD&gt;
&lt;TD style="border: none; padding: 0cm;" width="88"&gt;
&lt;P align="right"&gt;XXXX&lt;/P&gt;
&lt;/TD&gt;
&lt;TD style="border: none; padding: 0cm;" width="84"&gt;
&lt;P align="right"&gt;4500&lt;/P&gt;
&lt;/TD&gt;
&lt;TD style="border: none; padding: 0cm;" width="84"&gt;
&lt;P align="right"&gt;&amp;nbsp;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD style="border: none; padding: 0cm;" width="86"&gt;
&lt;P align="right"&gt;&amp;nbsp;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;/TBODY&gt;
&lt;/TABLE&gt;
&lt;/CENTER&gt;&lt;/TH&gt;
&lt;/TR&gt;
&lt;/TBODY&gt;
&lt;/TABLE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD style="border: none; padding: 0cm;" width="100%"&gt;&amp;nbsp;&lt;/TD&gt;
&lt;/TR&gt;
&lt;/TBODY&gt;
&lt;/TABLE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;/TBODY&gt;
&lt;/TABLE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;/TBODY&gt;
&lt;/TABLE&gt;
&lt;P&gt;&lt;BR /&gt;&lt;BR /&gt;Keep in mind that we have no clue how your original dataset really looks, as you did not provide it in usable form (data step with datalines).&lt;/P&gt;</description>
      <pubDate>Mon, 18 Feb 2019 09:05:48 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Get-t-1-t-t-1-t-2-t-n-value-from-the-same-table-as-new-fields/m-p/536396#M147404</guid>
      <dc:creator>Kurt_Bremser</dc:creator>
      <dc:date>2019-02-18T09:05:48Z</dc:date>
    </item>
    <item>
      <title>Re: Get t-1, t , t+1, t+2,...,t+n value from the same table as new fields.</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Get-t-1-t-t-1-t-2-t-n-value-from-the-same-table-as-new-fields/m-p/536423#M147416</link>
      <description>&lt;P&gt;Got it.&lt;/P&gt;&lt;P&gt;Because I'm using the original table but didnt change the table name at avgList part.&lt;/P&gt;&lt;P&gt;Thank you so much!!!&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Mon, 18 Feb 2019 09:55:19 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Get-t-1-t-t-1-t-2-t-n-value-from-the-same-table-as-new-fields/m-p/536423#M147416</guid>
      <dc:creator>dearkyr</dc:creator>
      <dc:date>2019-02-18T09:55:19Z</dc:date>
    </item>
  </channel>
</rss>

