<?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: Removing Missing Observations in a Row in SAS Programming</title>
    <link>https://communities.sas.com/t5/SAS-Programming/Removing-Missing-Observations-in-a-Row/m-p/778357#M247755</link>
    <description>&lt;P&gt;Just transpose it and then transpose it back.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;First let's make up some data. For example lets us your example result and introduce some "gaps".&amp;nbsp; Why not also introduce some inconsistency where sometimes there is a value but no date?&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data have; 
  input (date1-date4) (:yymmdd.) value1-value4 ;
  format date1-date4 yymmdd10.;
cards;
2019-05-24 2013-11-18 2012-07-13          . 10 1 8 .
2015-08-30 2019-03-16          .          . 1 2 . .
         . 2011-12-14          .          . . 1 . .
2023-03-08          . 2017-07-03          . 8 2 5 .
2021-03-27 2011-09-13          . 2018-02-04 9 4 . 5
;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;Now let's transpose.&amp;nbsp; Probably easier to use a data step to do the first transpose since you have multiple variables. Since the index into the array has no meaning (we are going to throw the original position away) lets use the older DO OVER syntax to make typing the code easier.&amp;nbsp; Let's make sure to introduce a unique row identifier if one does not exist.&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data tall;
  row+1;
  set have;
  array _d date1-date4;
  array _v value1-value4;
  do over _d;
    date=_d;
    value=_v;
    if n(date,value) then output;
  end;
  format date yymmdd10.;
  drop date1-date4 value1-value4;
run;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;Now to go from TALL back to wide we can use PROC SUMMARY.&amp;nbsp; But we will need to enter an upperbound for the maximum number of date/value pair variables we want to create.&amp;nbsp; We can hard code it to the original number, or calculate it from the TALL structure.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;proc summary data=tall nway;
  by row ;
  output out=want(drop=_type_) idgroup (out[4] (date value)=);
run;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;Original dateset.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="image.png" style="width: 693px;"&gt;&lt;img src="https://communities.sas.com/t5/image/serverpage/image-id/65373iAEE0A47E5AC21601/image-size/large?v=v2&amp;amp;px=999" role="button" title="image.png" alt="image.png" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;P&gt;Transposed TALL dataset.&lt;/P&gt;
&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="image.png" style="width: 254px;"&gt;&lt;img src="https://communities.sas.com/t5/image/serverpage/image-id/65375i86734F4F611E7258/image-size/large?v=v2&amp;amp;px=999" role="button" title="image.png" alt="image.png" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;P&gt;Resulting new dataset&lt;/P&gt;
&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="image.png" style="width: 833px;"&gt;&lt;img src="https://communities.sas.com/t5/image/serverpage/image-id/65376i9705906C385BF410/image-size/large?v=v2&amp;amp;px=999" role="button" title="image.png" alt="image.png" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;If you are worried about some rows having no values then add these lines to the end of the TALL data step.&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;call missing(date,value);
output;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;If there are other variables you want carried into the output dataset add them to the BY statement in the PROC SUMMARY step.&amp;nbsp; For example if you had ID and COMPANY variables your BY statement would look like.&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;by row id company ;&lt;/CODE&gt;&lt;/PRE&gt;</description>
    <pubDate>Wed, 03 Nov 2021 22:29:04 GMT</pubDate>
    <dc:creator>Tom</dc:creator>
    <dc:date>2021-11-03T22:29:04Z</dc:date>
    <item>
      <title>Removing Missing Observations in a Row</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Removing-Missing-Observations-in-a-Row/m-p/778334#M247744</link>
      <description>&lt;P&gt;I have 315 dates per observation where 0 to 50 of them per observation are non-missing, but where those non-missing dates are changes for each observation. Each date has a corresponding value. Below is a simpler example of the data structure with 10 dates and 10 corresponding values.&lt;/P&gt;&lt;TABLE&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;date1&lt;/TD&gt;&lt;TD&gt;date2&lt;/TD&gt;&lt;TD&gt;date3&lt;/TD&gt;&lt;TD&gt;date4&lt;/TD&gt;&lt;TD&gt;date5&lt;/TD&gt;&lt;TD&gt;date6&lt;/TD&gt;&lt;TD&gt;date7&lt;/TD&gt;&lt;TD&gt;date8&lt;/TD&gt;&lt;TD&gt;date9&lt;/TD&gt;&lt;TD&gt;date10&lt;/TD&gt;&lt;TD&gt;value1&lt;/TD&gt;&lt;TD&gt;value2&lt;/TD&gt;&lt;TD&gt;value3&lt;/TD&gt;&lt;TD&gt;value4&lt;/TD&gt;&lt;TD&gt;value5&lt;/TD&gt;&lt;TD&gt;value6&lt;/TD&gt;&lt;TD&gt;value7&lt;/TD&gt;&lt;TD&gt;value8&lt;/TD&gt;&lt;TD&gt;value9&lt;/TD&gt;&lt;TD&gt;value10&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;obs1&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;5/24/2019&lt;/TD&gt;&lt;TD&gt;11/18/2013&lt;/TD&gt;&lt;TD&gt;7/13/2012&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;10&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;8&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;obs2&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;8/30/2015&lt;/TD&gt;&lt;TD&gt;3/16/2019&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;obs3&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;12/14/2011&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;obs4&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;3/8/2023&lt;/TD&gt;&lt;TD&gt;11/4/2019&lt;/TD&gt;&lt;TD&gt;7/3/2017&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;8&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;5&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;obs5&lt;/TD&gt;&lt;TD&gt;3/27/2021&lt;/TD&gt;&lt;TD&gt;9/13/2011&lt;/TD&gt;&lt;TD&gt;11/19/2021&lt;/TD&gt;&lt;TD&gt;2/4/2018&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;9&lt;/TD&gt;&lt;TD&gt;4&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;5&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;I am trying essentially remove all blanks per row and shift the dates and values to be "left justified" for lack of a better term. In other words, I want the resulting dataset to be&lt;/P&gt;&lt;TABLE&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;newdate1&lt;/TD&gt;&lt;TD&gt;newdate2&lt;/TD&gt;&lt;TD&gt;newdate3&lt;/TD&gt;&lt;TD&gt;newdate4&lt;/TD&gt;&lt;TD&gt;newvalue1&lt;/TD&gt;&lt;TD&gt;newvalue2&lt;/TD&gt;&lt;TD&gt;newvalue3&lt;/TD&gt;&lt;TD&gt;newvalue4&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;obs1&lt;/TD&gt;&lt;TD&gt;5/24/2019&lt;/TD&gt;&lt;TD&gt;11/18/2013&lt;/TD&gt;&lt;TD&gt;7/13/2012&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;10&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;8&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;obs2&lt;/TD&gt;&lt;TD&gt;8/30/2015&lt;/TD&gt;&lt;TD&gt;3/16/2019&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;obs3&lt;/TD&gt;&lt;TD&gt;12/14/2011&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;obs4&lt;/TD&gt;&lt;TD&gt;3/8/2023&lt;/TD&gt;&lt;TD&gt;11/4/2019&lt;/TD&gt;&lt;TD&gt;7/3/2017&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;8&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;5&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;obs5&lt;/TD&gt;&lt;TD&gt;3/27/2021&lt;/TD&gt;&lt;TD&gt;9/13/2011&lt;/TD&gt;&lt;TD&gt;11/19/2021&lt;/TD&gt;&lt;TD&gt;2/4/2018&lt;/TD&gt;&lt;TD&gt;9&lt;/TD&gt;&lt;TD&gt;4&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;5&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;To do this, I have the following code.&amp;nbsp;&lt;/P&gt;&lt;PRE&gt;DATA DATA2; SET DATA;
NVALUES=N(OF DATE1-DATE315);
ARRAY DATENEW{50} DATENEW1-DATENEW50;
ARRAY DATE{315} DATE1-DATE315;
ARRAY VALUENEW{50} VALUENEW1-VALUENEW50;
ARRAY VALUE{315} VALUE1-VALUE315;
DO I=1 TO 315;
	IF DATE{I} NE . THEN DO J=1 TO NVALUES;
		DATENEW{J}=DATE{I}; VALUENEW{J}=VALUE{I};
	END;
END;
FORMAT DATENEW1-DATENEW50 MMDDYY10.;
RUN;&lt;/PRE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;However, the date and output I am getting is only the last nonzero date and value, as below:&lt;/P&gt;&lt;TABLE&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;newdate1&lt;/TD&gt;&lt;TD&gt;newdate2&lt;/TD&gt;&lt;TD&gt;newdate3&lt;/TD&gt;&lt;TD&gt;newdate4&lt;/TD&gt;&lt;TD&gt;value 1&lt;/TD&gt;&lt;TD&gt;value 2&lt;/TD&gt;&lt;TD&gt;value 3&lt;/TD&gt;&lt;TD&gt;value 4&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;obs1&lt;/TD&gt;&lt;TD&gt;7/13/2012&lt;/TD&gt;&lt;TD&gt;7/13/2012&lt;/TD&gt;&lt;TD&gt;7/13/2012&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;8&lt;/TD&gt;&lt;TD&gt;8&lt;/TD&gt;&lt;TD&gt;8&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;obs2&lt;/TD&gt;&lt;TD&gt;3/16/2019&lt;/TD&gt;&lt;TD&gt;3/16/2019&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;obs3&lt;/TD&gt;&lt;TD&gt;12/14/2011&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;obs4&lt;/TD&gt;&lt;TD&gt;7/3/2017&lt;/TD&gt;&lt;TD&gt;7/3/2017&lt;/TD&gt;&lt;TD&gt;7/3/2017&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;5&lt;/TD&gt;&lt;TD&gt;5&lt;/TD&gt;&lt;TD&gt;5&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;obs5&lt;/TD&gt;&lt;TD&gt;2/4/2018&lt;/TD&gt;&lt;TD&gt;2/4/2018&lt;/TD&gt;&lt;TD&gt;2/4/2018&lt;/TD&gt;&lt;TD&gt;2/4/2018&lt;/TD&gt;&lt;TD&gt;5&lt;/TD&gt;&lt;TD&gt;5&lt;/TD&gt;&lt;TD&gt;5&lt;/TD&gt;&lt;TD&gt;5&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Any help to correct this would be much appreciated.&lt;/P&gt;</description>
      <pubDate>Wed, 03 Nov 2021 20:51:46 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Removing-Missing-Observations-in-a-Row/m-p/778334#M247744</guid>
      <dc:creator>JonKetchup</dc:creator>
      <dc:date>2021-11-03T20:51:46Z</dc:date>
    </item>
    <item>
      <title>Re: Removing Missing Observations in a Row</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Removing-Missing-Observations-in-a-Row/m-p/778337#M247746</link>
      <description>&lt;UL&gt;
&lt;LI&gt;Transpose to a long format&lt;/LI&gt;
&lt;LI&gt;Delete missing&lt;/LI&gt;
&lt;LI&gt;Sort&lt;/LI&gt;
&lt;LI&gt;Transpose back&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Or within a data step&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Find number of non-missing entries -&amp;gt; N()&lt;/LI&gt;
&lt;LI&gt;Loop through using LARGEST/SMALLEST to allocate to new locations&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Not sure how this would handle ties&amp;nbsp;&lt;/STRONG&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data long;
set data;
ARRAY _DATE{315} DATE1-DATE315;
ARRAY _VALUE{50} VALUE1-VALUE315;

do i=1 to dim(_date);
if not missing(_date(i)) then do;
Record = _n_;
Date = _date(i);
Value = _value(i);
output;
end;
end;
run;

proc sort data=long;
by record date value;
run;

proc transpose data=long out=date prefix=date;
by record;
var date;
run;

proc transpose data=long out=values prefix=values;
by record;
var Value;
run;

data want;
merge date values;
by record;
keep date1-date50 values1-value50 record;
run;
run;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;BLOCKQUOTE&gt;&lt;HR /&gt;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/392824"&gt;@JonKetchup&lt;/a&gt;&amp;nbsp;wrote:&lt;BR /&gt;
&lt;P&gt;I have 315 dates per observation where 0 to 50 of them per observation are non-missing, but where those non-missing dates are changes for each observation. Each date has a corresponding value. Below is a simpler example of the data structure with 10 dates and 10 corresponding values.&lt;/P&gt;
&lt;TABLE&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;date1&lt;/TD&gt;
&lt;TD&gt;date2&lt;/TD&gt;
&lt;TD&gt;date3&lt;/TD&gt;
&lt;TD&gt;date4&lt;/TD&gt;
&lt;TD&gt;date5&lt;/TD&gt;
&lt;TD&gt;date6&lt;/TD&gt;
&lt;TD&gt;date7&lt;/TD&gt;
&lt;TD&gt;date8&lt;/TD&gt;
&lt;TD&gt;date9&lt;/TD&gt;
&lt;TD&gt;date10&lt;/TD&gt;
&lt;TD&gt;value1&lt;/TD&gt;
&lt;TD&gt;value2&lt;/TD&gt;
&lt;TD&gt;value3&lt;/TD&gt;
&lt;TD&gt;value4&lt;/TD&gt;
&lt;TD&gt;value5&lt;/TD&gt;
&lt;TD&gt;value6&lt;/TD&gt;
&lt;TD&gt;value7&lt;/TD&gt;
&lt;TD&gt;value8&lt;/TD&gt;
&lt;TD&gt;value9&lt;/TD&gt;
&lt;TD&gt;value10&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;obs1&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;5/24/2019&lt;/TD&gt;
&lt;TD&gt;11/18/2013&lt;/TD&gt;
&lt;TD&gt;7/13/2012&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;10&lt;/TD&gt;
&lt;TD&gt;1&lt;/TD&gt;
&lt;TD&gt;8&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;obs2&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;8/30/2015&lt;/TD&gt;
&lt;TD&gt;3/16/2019&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;1&lt;/TD&gt;
&lt;TD&gt;2&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;obs3&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;12/14/2011&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;1&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;obs4&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;3/8/2023&lt;/TD&gt;
&lt;TD&gt;11/4/2019&lt;/TD&gt;
&lt;TD&gt;7/3/2017&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;8&lt;/TD&gt;
&lt;TD&gt;2&lt;/TD&gt;
&lt;TD&gt;5&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;obs5&lt;/TD&gt;
&lt;TD&gt;3/27/2021&lt;/TD&gt;
&lt;TD&gt;9/13/2011&lt;/TD&gt;
&lt;TD&gt;11/19/2021&lt;/TD&gt;
&lt;TD&gt;2/4/2018&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;9&lt;/TD&gt;
&lt;TD&gt;4&lt;/TD&gt;
&lt;TD&gt;2&lt;/TD&gt;
&lt;TD&gt;5&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;/TR&gt;
&lt;/TBODY&gt;
&lt;/TABLE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;I am trying essentially remove all blanks per row and shift the dates and values to be "left justified" for lack of a better term. In other words, I want the resulting dataset to be&lt;/P&gt;
&lt;TABLE&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;newdate1&lt;/TD&gt;
&lt;TD&gt;newdate2&lt;/TD&gt;
&lt;TD&gt;newdate3&lt;/TD&gt;
&lt;TD&gt;newdate4&lt;/TD&gt;
&lt;TD&gt;newvalue1&lt;/TD&gt;
&lt;TD&gt;newvalue2&lt;/TD&gt;
&lt;TD&gt;newvalue3&lt;/TD&gt;
&lt;TD&gt;newvalue4&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;obs1&lt;/TD&gt;
&lt;TD&gt;5/24/2019&lt;/TD&gt;
&lt;TD&gt;11/18/2013&lt;/TD&gt;
&lt;TD&gt;7/13/2012&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;10&lt;/TD&gt;
&lt;TD&gt;1&lt;/TD&gt;
&lt;TD&gt;8&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;obs2&lt;/TD&gt;
&lt;TD&gt;8/30/2015&lt;/TD&gt;
&lt;TD&gt;3/16/2019&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;1&lt;/TD&gt;
&lt;TD&gt;2&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;obs3&lt;/TD&gt;
&lt;TD&gt;12/14/2011&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;1&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;obs4&lt;/TD&gt;
&lt;TD&gt;3/8/2023&lt;/TD&gt;
&lt;TD&gt;11/4/2019&lt;/TD&gt;
&lt;TD&gt;7/3/2017&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;8&lt;/TD&gt;
&lt;TD&gt;2&lt;/TD&gt;
&lt;TD&gt;5&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;obs5&lt;/TD&gt;
&lt;TD&gt;3/27/2021&lt;/TD&gt;
&lt;TD&gt;9/13/2011&lt;/TD&gt;
&lt;TD&gt;11/19/2021&lt;/TD&gt;
&lt;TD&gt;2/4/2018&lt;/TD&gt;
&lt;TD&gt;9&lt;/TD&gt;
&lt;TD&gt;4&lt;/TD&gt;
&lt;TD&gt;2&lt;/TD&gt;
&lt;TD&gt;5&lt;/TD&gt;
&lt;/TR&gt;
&lt;/TBODY&gt;
&lt;/TABLE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;To do this, I have the following code.&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;DATA DATA2; SET DATA;
NVALUES=N(OF DATE1-DATE315);
ARRAY DATENEW{50} DATENEW1-DATENEW50;
ARRAY DATE{315} DATE1-DATE315;
ARRAY VALUENEW{50} VALUENEW1-VALUENEW50;
ARRAY VALUE{315} VALUE1-VALUE315;
DO I=1 TO 315;
	IF DATE{I} NE . THEN DO J=1 TO NVALUES;
		DATENEW{J}=DATE{I}; VALUENEW{J}=VALUE{I};
	END;
END;
FORMAT DATENEW1-DATENEW50 MMDDYY10.;
RUN;&lt;/PRE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;However, the date and output I am getting is only the last nonzero date and value, as below:&lt;/P&gt;
&lt;TABLE&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;newdate1&lt;/TD&gt;
&lt;TD&gt;newdate2&lt;/TD&gt;
&lt;TD&gt;newdate3&lt;/TD&gt;
&lt;TD&gt;newdate4&lt;/TD&gt;
&lt;TD&gt;value 1&lt;/TD&gt;
&lt;TD&gt;value 2&lt;/TD&gt;
&lt;TD&gt;value 3&lt;/TD&gt;
&lt;TD&gt;value 4&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;obs1&lt;/TD&gt;
&lt;TD&gt;7/13/2012&lt;/TD&gt;
&lt;TD&gt;7/13/2012&lt;/TD&gt;
&lt;TD&gt;7/13/2012&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;8&lt;/TD&gt;
&lt;TD&gt;8&lt;/TD&gt;
&lt;TD&gt;8&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;obs2&lt;/TD&gt;
&lt;TD&gt;3/16/2019&lt;/TD&gt;
&lt;TD&gt;3/16/2019&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;2&lt;/TD&gt;
&lt;TD&gt;2&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;obs3&lt;/TD&gt;
&lt;TD&gt;12/14/2011&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;1&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;obs4&lt;/TD&gt;
&lt;TD&gt;7/3/2017&lt;/TD&gt;
&lt;TD&gt;7/3/2017&lt;/TD&gt;
&lt;TD&gt;7/3/2017&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;5&lt;/TD&gt;
&lt;TD&gt;5&lt;/TD&gt;
&lt;TD&gt;5&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;obs5&lt;/TD&gt;
&lt;TD&gt;2/4/2018&lt;/TD&gt;
&lt;TD&gt;2/4/2018&lt;/TD&gt;
&lt;TD&gt;2/4/2018&lt;/TD&gt;
&lt;TD&gt;2/4/2018&lt;/TD&gt;
&lt;TD&gt;5&lt;/TD&gt;
&lt;TD&gt;5&lt;/TD&gt;
&lt;TD&gt;5&lt;/TD&gt;
&lt;TD&gt;5&lt;/TD&gt;
&lt;/TR&gt;
&lt;/TBODY&gt;
&lt;/TABLE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Any help to correct this would be much appreciated.&lt;/P&gt;
&lt;HR /&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Wed, 03 Nov 2021 21:07:40 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Removing-Missing-Observations-in-a-Row/m-p/778337#M247746</guid>
      <dc:creator>Reeza</dc:creator>
      <dc:date>2021-11-03T21:07:40Z</dc:date>
    </item>
    <item>
      <title>Re: Removing Missing Observations in a Row</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Removing-Missing-Observations-in-a-Row/m-p/778340#M247748</link>
      <description>I will write pseudo-code for this. Keep only the ids and the dates. Take each row into a little dataset and delete all the missing date cells/columns. Rename the remaining date variables. Set the rows. Merge to the other part of the initial dataset (ids and the values).&lt;BR /&gt;Deleting missing date cells is tricky because SAS does not do conditional variable drops. The info how to do that is here:&lt;BR /&gt;&lt;A href="https://sasexamplecode.com/how-to-identify-remove-empty-columns-in-sas/" target="_blank"&gt;https://sasexamplecode.com/how-to-identify-remove-empty-columns-in-sas/&lt;/A&gt;&lt;BR /&gt;</description>
      <pubDate>Wed, 03 Nov 2021 21:23:08 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Removing-Missing-Observations-in-a-Row/m-p/778340#M247748</guid>
      <dc:creator>pink_poodle</dc:creator>
      <dc:date>2021-11-03T21:23:08Z</dc:date>
    </item>
    <item>
      <title>Re: Removing Missing Observations in a Row</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Removing-Missing-Observations-in-a-Row/m-p/778342#M247749</link>
      <description>&lt;P&gt;Transpose to a long layout, and keep only non-missing values. Extract the number from _name_ and use it to join the dates and values into a single dataset.&lt;/P&gt;</description>
      <pubDate>Wed, 03 Nov 2021 21:29:24 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Removing-Missing-Observations-in-a-Row/m-p/778342#M247749</guid>
      <dc:creator>Kurt_Bremser</dc:creator>
      <dc:date>2021-11-03T21:29:24Z</dc:date>
    </item>
    <item>
      <title>Re: Removing Missing Observations in a Row</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Removing-Missing-Observations-in-a-Row/m-p/778344#M247750</link>
      <description>&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;%let &amp;amp;nrows = ..; *number of rows in you dataset;
%macro new_rows; *makes new rows;
%do i = 1 %to &amp;amp;nrows;

1) little row data set;
data part1;
set have;
keep id date:;
if _N_=&amp;amp;i;
run;

2) delete empty cells;
ods select nlevels;
proc freq data=work.my_data nlevels;
ods output nlevels=work.nlevels_my_data;
run;

proc sql;
	select TableVar into :empty_columns separated by ","
	from part1
	where nnonmisslevels = 0;
quit;

proc sql;
	alter table part1
	drop &amp;amp;emptycolumns;
quit;

3) rename variables;
data part1;
set part1;
https://communities.sas.com/t5/SAS-Programming/Rename-all-variables/td-p/500828?nobounce;

4) saving one row to be set;
data row&amp;amp;i;
set part1;
run;

%mend t;

5) set all rows;
data whole;
%macro setter;
%do i=1 %to &amp;amp;nrows;
row&amp;amp;i
%end;
run;
%mend setter;
&lt;/CODE&gt;&lt;/PRE&gt;</description>
      <pubDate>Wed, 03 Nov 2021 21:36:51 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Removing-Missing-Observations-in-a-Row/m-p/778344#M247750</guid>
      <dc:creator>pink_poodle</dc:creator>
      <dc:date>2021-11-03T21:36:51Z</dc:date>
    </item>
    <item>
      <title>Re: Removing Missing Observations in a Row</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Removing-Missing-Observations-in-a-Row/m-p/778346#M247752</link>
      <description>&lt;P&gt;Thanks for the help. The keep statement is not working, but that is not a big deal. However, this seems to be removing all observations that have no dates/values, and I need to preserve those. There are also other variables in the datasets I need to be preserved, like ID. How would I make those changes?&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Wed, 03 Nov 2021 21:43:07 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Removing-Missing-Observations-in-a-Row/m-p/778346#M247752</guid>
      <dc:creator>JonKetchup</dc:creator>
      <dc:date>2021-11-03T21:43:07Z</dc:date>
    </item>
    <item>
      <title>Re: Removing Missing Observations in a Row</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Removing-Missing-Observations-in-a-Row/m-p/778349#M247754</link>
      <description>&lt;BLOCKQUOTE&gt;&lt;HR /&gt;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/392824"&gt;@JonKetchup&lt;/a&gt;&amp;nbsp;wrote:&lt;BR /&gt;
&lt;P&gt;Thanks for the help. The keep statement is not working, but that is not a big deal. However, this seems to be removing all observations that have no dates/values, and I need to preserve those.&amp;nbsp;&lt;/P&gt;
&lt;HR /&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Add a condition that if N values is 0 then just output at least one.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;BLOCKQUOTE&gt;&lt;HR /&gt;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/392824"&gt;@JonKetchup&lt;/a&gt;&amp;nbsp;wrote:&lt;BR /&gt;
&lt;P&gt;&amp;nbsp;There are also other variables in the datasets I need to be preserved, like ID. How would I make those changes?&amp;nbsp;&lt;/P&gt;
&lt;HR /&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;I used record as the identifier which I made. You can add variables to your KEEP statement in the transpose step and then add them to the BY statement if they help to uniquely identify a row.&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Wed, 03 Nov 2021 22:06:24 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Removing-Missing-Observations-in-a-Row/m-p/778349#M247754</guid>
      <dc:creator>Reeza</dc:creator>
      <dc:date>2021-11-03T22:06:24Z</dc:date>
    </item>
    <item>
      <title>Re: Removing Missing Observations in a Row</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Removing-Missing-Observations-in-a-Row/m-p/778357#M247755</link>
      <description>&lt;P&gt;Just transpose it and then transpose it back.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;First let's make up some data. For example lets us your example result and introduce some "gaps".&amp;nbsp; Why not also introduce some inconsistency where sometimes there is a value but no date?&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data have; 
  input (date1-date4) (:yymmdd.) value1-value4 ;
  format date1-date4 yymmdd10.;
cards;
2019-05-24 2013-11-18 2012-07-13          . 10 1 8 .
2015-08-30 2019-03-16          .          . 1 2 . .
         . 2011-12-14          .          . . 1 . .
2023-03-08          . 2017-07-03          . 8 2 5 .
2021-03-27 2011-09-13          . 2018-02-04 9 4 . 5
;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;Now let's transpose.&amp;nbsp; Probably easier to use a data step to do the first transpose since you have multiple variables. Since the index into the array has no meaning (we are going to throw the original position away) lets use the older DO OVER syntax to make typing the code easier.&amp;nbsp; Let's make sure to introduce a unique row identifier if one does not exist.&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data tall;
  row+1;
  set have;
  array _d date1-date4;
  array _v value1-value4;
  do over _d;
    date=_d;
    value=_v;
    if n(date,value) then output;
  end;
  format date yymmdd10.;
  drop date1-date4 value1-value4;
run;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;Now to go from TALL back to wide we can use PROC SUMMARY.&amp;nbsp; But we will need to enter an upperbound for the maximum number of date/value pair variables we want to create.&amp;nbsp; We can hard code it to the original number, or calculate it from the TALL structure.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;proc summary data=tall nway;
  by row ;
  output out=want(drop=_type_) idgroup (out[4] (date value)=);
run;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;Original dateset.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="image.png" style="width: 693px;"&gt;&lt;img src="https://communities.sas.com/t5/image/serverpage/image-id/65373iAEE0A47E5AC21601/image-size/large?v=v2&amp;amp;px=999" role="button" title="image.png" alt="image.png" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;P&gt;Transposed TALL dataset.&lt;/P&gt;
&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="image.png" style="width: 254px;"&gt;&lt;img src="https://communities.sas.com/t5/image/serverpage/image-id/65375i86734F4F611E7258/image-size/large?v=v2&amp;amp;px=999" role="button" title="image.png" alt="image.png" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;P&gt;Resulting new dataset&lt;/P&gt;
&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="image.png" style="width: 833px;"&gt;&lt;img src="https://communities.sas.com/t5/image/serverpage/image-id/65376i9705906C385BF410/image-size/large?v=v2&amp;amp;px=999" role="button" title="image.png" alt="image.png" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;If you are worried about some rows having no values then add these lines to the end of the TALL data step.&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;call missing(date,value);
output;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;If there are other variables you want carried into the output dataset add them to the BY statement in the PROC SUMMARY step.&amp;nbsp; For example if you had ID and COMPANY variables your BY statement would look like.&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;by row id company ;&lt;/CODE&gt;&lt;/PRE&gt;</description>
      <pubDate>Wed, 03 Nov 2021 22:29:04 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Removing-Missing-Observations-in-a-Row/m-p/778357#M247755</guid>
      <dc:creator>Tom</dc:creator>
      <dc:date>2021-11-03T22:29:04Z</dc:date>
    </item>
    <item>
      <title>Re: Removing Missing Observations in a Row</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Removing-Missing-Observations-in-a-Row/m-p/778360#M247756</link>
      <description>And handles ties correctly, definitely a simpler approach.</description>
      <pubDate>Wed, 03 Nov 2021 22:19:55 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Removing-Missing-Observations-in-a-Row/m-p/778360#M247756</guid>
      <dc:creator>Reeza</dc:creator>
      <dc:date>2021-11-03T22:19:55Z</dc:date>
    </item>
    <item>
      <title>Re: Removing Missing Observations in a Row</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Removing-Missing-Observations-in-a-Row/m-p/778361#M247757</link>
      <description>&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data have; 
  input ID Sex $1. (date1-date4) (:yymmdd.) value1-value4 ;
  format date1-date4 yymmdd10.;
cards;
1 F 2019-05-24 2019-05-24 2012-07-13          . 10 10 8 .
2 F 2015-08-30 2019-03-16          .          . 1 2 . .
3 M         . 2011-12-14          .          . . 1 . .
4 F 2023-03-08          . 2017-07-03          . 8 2 5 .
5 M 2021-03-27 2011-09-13          . 2018-02-04 9 4 . 5
         .          .          .          . . . . .
;


data long;
set have;
ARRAY _DATE{4} DATE1-DATE4;
ARRAY _VALUE{4} VALUE1-VALUE4;

do i=1 to dim(_date);
if not missing(_date(i)) then do;
Date = _date(i);
Value = _value(i);
output;
end;
end;

keep id sex date value;
run;

proc sort data=long;
by ID sex date value;
run;

proc transpose data=long out=date prefix=date;
by ID SEX;
var date;
run;

proc transpose data=long out=values prefix=values;
by ID SEX;
var Value;
run;

data want;
merge date values;
by ID SEX;
run;&lt;/CODE&gt;&lt;/PRE&gt;</description>
      <pubDate>Wed, 03 Nov 2021 22:30:12 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Removing-Missing-Observations-in-a-Row/m-p/778361#M247757</guid>
      <dc:creator>Reeza</dc:creator>
      <dc:date>2021-11-03T22:30:12Z</dc:date>
    </item>
    <item>
      <title>Re: Removing Missing Observations in a Row</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Removing-Missing-Observations-in-a-Row/m-p/778471#M247786</link>
      <description>&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data have; 
  input (date1-date4) (:yymmdd.) value1-value4 ;
  format date1-date4 yymmdd10.;
cards;
2019-05-24 2013-11-18 2012-07-13          . 10 1 8 .
2015-08-30 2019-03-16          .          . 1 2 . .
         . 2011-12-14          .          . . 1 . .
2023-03-08          . 2017-07-03          . 8 2 5 .
2021-03-27 2011-09-13          . 2018-02-04 9 4 . 5
;

data want;
 set have;
 array newdate{4};
 array newvalue{4};

 array d{*} date1-date4;
 array v{*} value1-value4;

j=0;
do i=1 to dim(d);
 if not missing(d{i}) then do;j+1;newdate{j}=d{i};end;
end;

j=0;
do i=1 to dim(d);
 if not missing(v{i}) then do;j+1;newvalue{j}=v{i};end;
end;

drop date1-date4 value1-value4 i j;
format newdate: yymmdd10.;
run;&lt;/CODE&gt;&lt;/PRE&gt;</description>
      <pubDate>Thu, 04 Nov 2021 11:43:56 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Removing-Missing-Observations-in-a-Row/m-p/778471#M247786</guid>
      <dc:creator>Ksharp</dc:creator>
      <dc:date>2021-11-04T11:43:56Z</dc:date>
    </item>
  </channel>
</rss>

