<?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: filling in missing dates with closest previous or after value by group in SAS Programming</title>
    <link>https://communities.sas.com/t5/SAS-Programming/filling-in-missing-dates-with-closest-previous-or-after-value-by/m-p/685184#M207777</link>
    <description>&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data  have;
infile cards truncover;
input pin  date_1 : mmddyy10.   d_visit : mmddyy10. ;
format date_1  d_visit  mmddyy10.;
datalines ;
	3  1/30/2013  
	3  6/19/2014  6/19/2014
	3  1/28/2015  11/12/2015
	5  2/27/2013  
	5  3/14/2014  3/14/2014
	5  5/29/2015  
	5  2/5/2016	  
	5  2/10/2017  2/10/2017
	6  4/15/2013  
	6  4/1/2014	  4/1/2014
	6  10/5/2015  
	6  6/20/2016  
	6  1/31/2017  1/31/2017
	;
run;
proc sql;
create table want as
select a.pin,a.date_1,coalesce(a.d_visit,b.d_visit) as d_visit format=mmddyy10.
 from have as a , have as b
  where a.pin=b.pin	and b.d_visit is not missing
   group by a.pin,a.date_1
    having abs(a.date_1-b.d_visit)=min(abs(a.date_1-b.d_visit));
quit;&lt;/CODE&gt;&lt;/PRE&gt;</description>
    <pubDate>Sat, 19 Sep 2020 13:19:05 GMT</pubDate>
    <dc:creator>Ksharp</dc:creator>
    <dc:date>2020-09-19T13:19:05Z</dc:date>
    <item>
      <title>filling in missing dates with closest previous or after value by group</title>
      <link>https://communities.sas.com/t5/SAS-Programming/filling-in-missing-dates-with-closest-previous-or-after-value-by/m-p/684800#M207594</link>
      <description>&lt;P&gt;Hi everyone,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;I had data like this:&lt;/P&gt;&lt;TABLE&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;PIN&lt;/TD&gt;&lt;TD&gt;date_1&lt;/TD&gt;&lt;TD&gt;D_VISIT&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;01/30/2013&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;06/19/2014&lt;/TD&gt;&lt;TD&gt;6/19/2014&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;01/28/2015&lt;/TD&gt;&lt;TD&gt;11/12/2015&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;5&lt;/TD&gt;&lt;TD&gt;02/27/2013&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;5&lt;/TD&gt;&lt;TD&gt;03/14/2014&lt;/TD&gt;&lt;TD&gt;3/14/2014&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;5&lt;/TD&gt;&lt;TD&gt;05/29/2015&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;5&lt;/TD&gt;&lt;TD&gt;02/05/2016&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;5&lt;/TD&gt;&lt;TD&gt;02/10/2017&lt;/TD&gt;&lt;TD&gt;2/10/2017&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;6&lt;/TD&gt;&lt;TD&gt;04/15/2013&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;6&lt;/TD&gt;&lt;TD&gt;04/01/2014&lt;/TD&gt;&lt;TD&gt;4/1/2014&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;6&lt;/TD&gt;&lt;TD&gt;10/05/2015&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;6&lt;/TD&gt;&lt;TD&gt;06/20/2016&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;6&lt;/TD&gt;&lt;TD&gt;01/31/2017&lt;/TD&gt;&lt;TD&gt;1/31/2017&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;I hope I could fill in the missing value by the closest date_1&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;TABLE&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;PIN&lt;/TD&gt;&lt;TD&gt;date_1&lt;/TD&gt;&lt;TD&gt;D_VISIT&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;01/30/2013&lt;/TD&gt;&lt;TD&gt;6/19/2014&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;06/19/2014&lt;/TD&gt;&lt;TD&gt;6/19/2014&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;01/28/2015&lt;/TD&gt;&lt;TD&gt;11/12/2015&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;5&lt;/TD&gt;&lt;TD&gt;02/27/2013&lt;/TD&gt;&lt;TD&gt;3/14/2014&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;5&lt;/TD&gt;&lt;TD&gt;03/14/2014&lt;/TD&gt;&lt;TD&gt;3/14/2014&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;5&lt;/TD&gt;&lt;TD&gt;05/29/2015&lt;/TD&gt;&lt;TD&gt;3/14/2014&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;5&lt;/TD&gt;&lt;TD&gt;02/05/2016&lt;/TD&gt;&lt;TD&gt;2/10/2017&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;5&lt;/TD&gt;&lt;TD&gt;02/10/2017&lt;/TD&gt;&lt;TD&gt;2/10/2017&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;6&lt;/TD&gt;&lt;TD&gt;04/15/2013&lt;/TD&gt;&lt;TD&gt;4/1/2014&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;6&lt;/TD&gt;&lt;TD&gt;04/01/2014&lt;/TD&gt;&lt;TD&gt;4/1/2014&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;6&lt;/TD&gt;&lt;TD&gt;10/05/2015&lt;/TD&gt;&lt;TD&gt;4/1/2014&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;6&lt;/TD&gt;&lt;TD&gt;06/20/2016&lt;/TD&gt;&lt;TD&gt;1/31/2017&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;6&lt;/TD&gt;&lt;TD&gt;01/31/2017&lt;/TD&gt;&lt;TD&gt;1/31/2017&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;I searched topics and tried to use some codes:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;data want;&lt;BR /&gt;do _n_ = 1 by 1 until (last.pin);&lt;BR /&gt;set original_data;&lt;BR /&gt;by pin;&lt;BR /&gt;if missing(first_d_visit) and not missing(d_visit) then&lt;BR /&gt;first_d_visit = d_visit;&lt;/P&gt;&lt;P&gt;end;&lt;BR /&gt;prev_d_visit = first_d_visit;&lt;BR /&gt;do _n_ = 1 by 1 until (last.pin);&lt;BR /&gt;set original;&lt;BR /&gt;by pin;&lt;BR /&gt;if missing(d_visit) then&lt;BR /&gt;d_visit = prev_d_visit;&lt;BR /&gt;prev_d_visit = d_visit;&lt;BR /&gt;output;&lt;BR /&gt;end;&lt;BR /&gt;format first_d_visit mmddyy10. prev_d_visit mmddyy10.;&lt;BR /&gt;run;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;But didn't give me the closest dates, but the previous dates.&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Any suggestion would be really appreciated&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Thu, 17 Sep 2020 21:06:59 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/filling-in-missing-dates-with-closest-previous-or-after-value-by/m-p/684800#M207594</guid>
      <dc:creator>linda0910</dc:creator>
      <dc:date>2020-09-17T21:06:59Z</dc:date>
    </item>
    <item>
      <title>Re: filling in missing dates with closest previous or after value by group</title>
      <link>https://communities.sas.com/t5/SAS-Programming/filling-in-missing-dates-with-closest-previous-or-after-value-by/m-p/684864#M207625</link>
      <description>&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data  have;
input in  $1-2    date_1 $3-13   d_visit $15-25  ;
datalines ;
	3  1/30/2013  
	3  6/19/2014  6/19/2014
	3  1/28/2015  11/12/2015
	5  2/27/2013  
	5  3/14/2014  3/14/2014
	5  5/29/2015  
	5  2/5/2016	  
	5  2/10/2017  2/10/2017
	6  4/15/2013  
	6  4/1/2014	  4/1/2014
	6  10/5/2015  
	6  6/20/2016  
	6  1/31/2017  1/31/2017
	;
run;


data  d ;
set  have ;
	by in;
	if first.in then col=1;
	else col+1 ;
	inn=input (in,best.);
run;


%macro all;

proc sql noprint;
	select distinct in into :allin separated by ' ' 
	from d;
quit;

%put &amp;gt;&amp;gt; &amp;amp;allin ;
%let count= %sysfunc (countw (&amp;amp;allin));
%put &amp;gt;&amp;gt; &amp;amp;count ;

%do i = 1 %to &amp;amp;count ;
%let subset = %qscan (&amp;amp;allin , &amp;amp;i);

		data d2 ;
		set d  end= eof ;
			by inn;
			where inn = &amp;amp;subset ;
			if last.inn then lim=col;
			vis2=d_visit;
			if eof then call symput ('last' , compress (put(_n_,8.)));
		run;
		%put &amp;gt;&amp;gt;&amp;gt; &amp;amp;last ;

		data   d3 (keep= dt: inn) ;
			array dt  {&amp;amp;last } $200  ;
			do until (last.in );
			set  d2 ;
			by in;
			dt (col)= vis2; 
		end;

		run;

		data d4 ;
		merge d2 (in=a) d3  (in=b) ;
		by inn ;
			colcal= col-1;
			colcal2= col+1;
			prevvar= 'dt' || strip (colcal);
			nextvar= 'dt' || strip (colcal2);
		run;

		%macro var;
			data    d5 ;
				%do j= 1 %to &amp;amp;last ;
					set  d4 ;
					if prevvar= "dt&amp;amp;j" then prevvalue= dt&amp;amp;j ;
					if nextvar= "dt&amp;amp;j" then nextvalue= dt&amp;amp;j ;
				%end;
				/* main processing  */
				if d_visit= '' then do ;
					if prevvar='dt0' then d_visit=nextvalue ;
				if prevvar ne 'dt0' then do ;
					d_visit= COALESCEC  (prevvalue, nextvalue);
				end;
			    end;
			run;
		%mend var;
		%var;

		data   d6_&amp;amp;i ;
		set  d5 ;
		keep in date_1 d_visit inn ;
		run;

	%end;
%mend all ;

%all ;

 
data  f ;
set d6:  ;
run;
proc sort data=f out= want (drop= inn) ; by  inn ; run;&lt;/CODE&gt;&lt;/PRE&gt;</description>
      <pubDate>Fri, 18 Sep 2020 03:54:46 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/filling-in-missing-dates-with-closest-previous-or-after-value-by/m-p/684864#M207625</guid>
      <dc:creator>chetan3125</dc:creator>
      <dc:date>2020-09-18T03:54:46Z</dc:date>
    </item>
    <item>
      <title>Re: filling in missing dates with closest previous or after value by group</title>
      <link>https://communities.sas.com/t5/SAS-Programming/filling-in-missing-dates-with-closest-previous-or-after-value-by/m-p/684881#M207635</link>
      <description>&lt;P&gt;Have a look at:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data want(keep= pin date_1 d_visit);  
   array dates[100] _temporary_;
   
   *call missing(of dates[*]);
   i = 1;
   
   do _n_ = 1 by 1 until(last.pin);
      set work.have;
      by pin;
      
      if not missing(d_visit) then do;
         dates[i] = d_visit;
         i = i + 1;
      end;
   end;
   
   lastDate = i - 1;
   
   do _n_ = 1 by 1 until(last.pin);
      set work.have;
      by pin;
      
      if missing(d_visit) then do;
         minDiff = 100000;
         minId = .;
         
         do i = 1 to lastDate;
            d = abs(date_1 - dates[i]);
            
            if d &amp;lt; minDiff then do;
               minDiff = d;
               minId = i;
            end;
         end;
         
         d_visit = dates[minId];
      end;
      
      output;      
   end;
run;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;You will find one difference to the expected d_visit-value in the third obs for pin=6. I double checked it: the difference between 5h Oct 2015 and 1st Apr 2014 is 552 days, the difference to 31st Jan 2017 only 484 days.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Fri, 18 Sep 2020 05:26:12 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/filling-in-missing-dates-with-closest-previous-or-after-value-by/m-p/684881#M207635</guid>
      <dc:creator>andreas_lds</dc:creator>
      <dc:date>2020-09-18T05:26:12Z</dc:date>
    </item>
    <item>
      <title>Re: filling in missing dates with closest previous or after value by group</title>
      <link>https://communities.sas.com/t5/SAS-Programming/filling-in-missing-dates-with-closest-previous-or-after-value-by/m-p/684991#M207690</link>
      <description>&lt;P&gt;Thanks so much for your help. But I have more than 5000 obs, and the drive keeps warning me there is no enough space to save the temporary data.&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Fri, 18 Sep 2020 14:38:14 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/filling-in-missing-dates-with-closest-previous-or-after-value-by/m-p/684991#M207690</guid>
      <dc:creator>linda0910</dc:creator>
      <dc:date>2020-09-18T14:38:14Z</dc:date>
    </item>
    <item>
      <title>Re: filling in missing dates with closest previous or after value by group</title>
      <link>https://communities.sas.com/t5/SAS-Programming/filling-in-missing-dates-with-closest-previous-or-after-value-by/m-p/684993#M207691</link>
      <description>&lt;P&gt;Thanks so much. It's my bad and I haven't made it clear, that I have more than 5000 obs, and when I run the codes, it only generated the first 149 obs output.&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;ERROR: Array subscript out of range at line 549 column 20.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;When I tried to change the array to more than 5000, it still gave me the same ERROR, may I ask how to solve the problem?&amp;nbsp;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Thanks again&lt;/P&gt;</description>
      <pubDate>Fri, 18 Sep 2020 14:40:55 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/filling-in-missing-dates-with-closest-previous-or-after-value-by/m-p/684993#M207691</guid>
      <dc:creator>linda0910</dc:creator>
      <dc:date>2020-09-18T14:40:55Z</dc:date>
    </item>
    <item>
      <title>Re: filling in missing dates with closest previous or after value by group</title>
      <link>https://communities.sas.com/t5/SAS-Programming/filling-in-missing-dates-with-closest-previous-or-after-value-by/m-p/685184#M207777</link>
      <description>&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data  have;
infile cards truncover;
input pin  date_1 : mmddyy10.   d_visit : mmddyy10. ;
format date_1  d_visit  mmddyy10.;
datalines ;
	3  1/30/2013  
	3  6/19/2014  6/19/2014
	3  1/28/2015  11/12/2015
	5  2/27/2013  
	5  3/14/2014  3/14/2014
	5  5/29/2015  
	5  2/5/2016	  
	5  2/10/2017  2/10/2017
	6  4/15/2013  
	6  4/1/2014	  4/1/2014
	6  10/5/2015  
	6  6/20/2016  
	6  1/31/2017  1/31/2017
	;
run;
proc sql;
create table want as
select a.pin,a.date_1,coalesce(a.d_visit,b.d_visit) as d_visit format=mmddyy10.
 from have as a , have as b
  where a.pin=b.pin	and b.d_visit is not missing
   group by a.pin,a.date_1
    having abs(a.date_1-b.d_visit)=min(abs(a.date_1-b.d_visit));
quit;&lt;/CODE&gt;&lt;/PRE&gt;</description>
      <pubDate>Sat, 19 Sep 2020 13:19:05 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/filling-in-missing-dates-with-closest-previous-or-after-value-by/m-p/685184#M207777</guid>
      <dc:creator>Ksharp</dc:creator>
      <dc:date>2020-09-19T13:19:05Z</dc:date>
    </item>
    <item>
      <title>Re: filling in missing dates with closest previous or after value by group</title>
      <link>https://communities.sas.com/t5/SAS-Programming/filling-in-missing-dates-with-closest-previous-or-after-value-by/m-p/685305#M207828</link>
      <description>&lt;BLOCKQUOTE&gt;&lt;HR /&gt;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/162964"&gt;@linda0910&lt;/a&gt;&amp;nbsp;wrote:&lt;BR /&gt;
&lt;P&gt;Thanks so much. It's my bad and I haven't made it clear, that I have more than 5000 obs, and when I run the codes, it only generated the first 149 obs output.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;ERROR: Array subscript out of range at line 549 column 20.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;When I tried to change the array to more than 5000, it still gave me the same ERROR, may I ask how to solve the problem?&amp;nbsp;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Thanks again&lt;/P&gt;
&lt;HR /&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Please post the log with the error using "insert code" - the &amp;lt;/&amp;gt; icon.&lt;/P&gt;</description>
      <pubDate>Mon, 21 Sep 2020 05:18:24 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/filling-in-missing-dates-with-closest-previous-or-after-value-by/m-p/685305#M207828</guid>
      <dc:creator>andreas_lds</dc:creator>
      <dc:date>2020-09-21T05:18:24Z</dc:date>
    </item>
    <item>
      <title>Re: filling in missing dates with closest previous or after value by group</title>
      <link>https://communities.sas.com/t5/SAS-Programming/filling-in-missing-dates-with-closest-previous-or-after-value-by/m-p/685465#M207889</link>
      <description>Thanks so much. It worked perfectly.</description>
      <pubDate>Mon, 21 Sep 2020 15:22:37 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/filling-in-missing-dates-with-closest-previous-or-after-value-by/m-p/685465#M207889</guid>
      <dc:creator>linda0910</dc:creator>
      <dc:date>2020-09-21T15:22:37Z</dc:date>
    </item>
  </channel>
</rss>

