<?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: Longitudinal calculation across observations in SAS Programming</title>
    <link>https://communities.sas.com/t5/SAS-Programming/Longitudinal-calculation-across-observations/m-p/377315#M90590</link>
    <description>&lt;P&gt;Thanks a lot. Below codes suggested worked out. It outputs half of the data with lagtime between same UID which I wanted. However, I'd like to retain whole dataset. For that purpose when I eliminate:&lt;/P&gt;&lt;PRE&gt;&lt;CODE class=" language-sas"&gt; IF last.UID THEN OUTPUT;&lt;/CODE&gt;&lt;/PRE&gt;&lt;P&gt;output is not truncated to the last obs of UID but it contains lagtime between adjacent but different UIDs which i do not need. To get back to the whole dataset I merge the lagtime output data to the original one.&amp;nbsp;&lt;/P&gt;&lt;P&gt;I wonder, if there is a way to output whole dataset with lagtime within same UID but no unnessecary lagtime calculated between different UIDs? &amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;proc sort data=demo;
by UID; 

DATA demo1; SET demo;
 BY UID;
 RETAIN R_admission_startdate;
 IF FIRST.UID THEN DO;
 R_admission_startdate = admission_startdate;
 END;
 IF LAST.UID THEN DO;
 lagtime = admission_startdate - R_admission_startdate;
 OUTPUT;
 END;
 DROP R_: ; 
 RUN;&lt;/CODE&gt;&lt;/PRE&gt;&lt;P&gt;Using lag function:&lt;/P&gt;&lt;PRE&gt;&lt;CODE class=" language-sas"&gt; data demo1; set demo;
  by UID;
  LAGTIME = admission_startdate-lag(admission_startdate);
  IF last.UID THEN OUTPUT;
  run;&lt;/CODE&gt;&lt;/PRE&gt;&lt;P&gt;Thank you all.&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;My final code then is:&lt;/P&gt;&lt;PRE&gt;&lt;CODE class=" language-sas"&gt; data have1(drop=admission_startdate); set have(keep=UID admission_startdate);
  by UID;
  LAGTIME = admission_startdate-lag(admission_startdate);
  IF last.UID THEN OUTPUT;
  run;

data want;
merge
    doh.have  (in=a)
    doh.have1 (in=b);
by UID; 
if a and b then output;
run;
 &lt;/CODE&gt;&lt;/PRE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
    <pubDate>Wed, 19 Jul 2017 13:45:20 GMT</pubDate>
    <dc:creator>Cruise</dc:creator>
    <dc:date>2017-07-19T13:45:20Z</dc:date>
    <item>
      <title>Longitudinal calculation across observations</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Longitudinal-calculation-across-observations/m-p/377148#M90542</link>
      <description>&lt;P&gt;I'd like to calculate lagtime in admission dates between source 1 and 2. Below attempt results in lagtime variable created but missing all the way. Not calculated. Admission_date is a SAS date and numeric. I had no problem for substraction in data step in other programs.&lt;/P&gt;&lt;P&gt;Do you see where I mess up? &amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data demo;
input UID $ Source admission_date;
cards;
m12 1 20110
m12 2 20114
m13 1 20119
m13 2 20231
m14 1 20500
m14 2 20600
;
run;

proc sort data=demo;
by UID source; 
run;

DATA demo1; SET demo;
 BY UID source;
 RETAIN R_admission_date;
 IF FIRST.source THEN DO;
 R_admission_date = admission_date;
 END;
 IF LAST.source THEN DO;
 lagtime = admission_date - R_admission_date;
 OUTPUT;
 END;
 DROP R_: ; 
 RUN;&lt;/CODE&gt;&lt;/PRE&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;Thank you very much for your time.&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Tue, 18 Jul 2017 22:35:54 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Longitudinal-calculation-across-observations/m-p/377148#M90542</guid>
      <dc:creator>Cruise</dc:creator>
      <dc:date>2017-07-18T22:35:54Z</dc:date>
    </item>
    <item>
      <title>Re: Longitudinal calculation across observations</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Longitudinal-calculation-across-observations/m-p/377149#M90543</link>
      <description>&lt;P&gt;This program should give you all zero values (not all missing values).&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;The logic should condition on FIRST.UID and LAST.UID, not FIRST.SOURCE and LAST.SOURCE. &amp;nbsp;The way it reads now, it takes the beginning and ending date from the same observation.&lt;/P&gt;</description>
      <pubDate>Tue, 18 Jul 2017 22:57:12 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Longitudinal-calculation-across-observations/m-p/377149#M90543</guid>
      <dc:creator>Astounding</dc:creator>
      <dc:date>2017-07-18T22:57:12Z</dc:date>
    </item>
    <item>
      <title>Re: Longitudinal calculation across observations</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Longitudinal-calculation-across-observations/m-p/377154#M90545</link>
      <description>Even if i am interested in the difference between source 1 and 2 within same uid?&lt;BR /&gt;No sas with me yet. Will try your suggestion when i get to it.&lt;BR /&gt;</description>
      <pubDate>Wed, 19 Jul 2017 00:13:39 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Longitudinal-calculation-across-observations/m-p/377154#M90545</guid>
      <dc:creator>Cruise</dc:creator>
      <dc:date>2017-07-19T00:13:39Z</dc:date>
    </item>
    <item>
      <title>Re: Longitudinal calculation across observations</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Longitudinal-calculation-across-observations/m-p/377156#M90546</link>
      <description>&lt;BLOCKQUOTE&gt;&lt;HR /&gt;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/132289"&gt;@Cruise&lt;/a&gt; wrote:&lt;BR /&gt;Even if i am interested in the difference between source 1 and 2 within same uid?&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;HR /&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&lt;BR /&gt;Yes.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data demo2;
set demo;
by uid source;
first_source= first.source;
last_source = last.source;
first_uid=first.uid;
last_uid=last.uid;

run;

proc print;run;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;TABLE class="table"&gt;&lt;CAPTION&gt;&amp;nbsp;&lt;/CAPTION&gt;&lt;COLGROUP&gt;&lt;COL /&gt;&lt;/COLGROUP&gt;&lt;COLGROUP&gt;&lt;COL /&gt;&lt;COL /&gt;&lt;COL /&gt;&lt;COL /&gt;&lt;COL /&gt;&lt;COL /&gt;&lt;COL /&gt;&lt;/COLGROUP&gt;
&lt;THEAD&gt;
&lt;TR&gt;
&lt;TH class="r header" scope="col"&gt;Obs&lt;/TH&gt;
&lt;TH class="header" scope="col"&gt;UID&lt;/TH&gt;
&lt;TH class="r header" scope="col"&gt;Source &amp;lt;- &lt;FONT color="#FF0000"&gt;UID + SOURCE uniquely identifies a record&lt;/FONT&gt;&lt;/TH&gt;
&lt;TH class="r header" scope="col"&gt;admission_date&lt;/TH&gt;
&lt;TH class="r header" scope="col"&gt;first_source&lt;/TH&gt;
&lt;TH class="r header" scope="col"&gt;last_source&lt;/TH&gt;
&lt;TH class="r header" scope="col"&gt;first_uid&lt;/TH&gt;
&lt;TH class="r header" scope="col"&gt;last_uid&lt;/TH&gt;
&lt;/TR&gt;
&lt;/THEAD&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TH class="r rowheader" scope="row"&gt;1&lt;/TH&gt;
&lt;TD class="data"&gt;m12&lt;/TD&gt;
&lt;TD class="r data"&gt;1&lt;/TD&gt;
&lt;TD class="r data"&gt;20110&lt;/TD&gt;
&lt;TD class="r data"&gt;1&lt;/TD&gt;
&lt;TD class="r data"&gt;1&lt;/TD&gt;
&lt;TD class="r data"&gt;1&lt;/TD&gt;
&lt;TD class="r data"&gt;0&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TH class="r rowheader" scope="row"&gt;2&lt;/TH&gt;
&lt;TD class="data"&gt;m12&lt;/TD&gt;
&lt;TD class="r data"&gt;2&lt;/TD&gt;
&lt;TD class="r data"&gt;20114&lt;/TD&gt;
&lt;TD class="r data"&gt;1&lt;/TD&gt;
&lt;TD class="r data"&gt;1&lt;/TD&gt;
&lt;TD class="r data"&gt;0&lt;/TD&gt;
&lt;TD class="r data"&gt;1&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TH class="r rowheader" scope="row"&gt;3&lt;/TH&gt;
&lt;TD class="data"&gt;m13&lt;/TD&gt;
&lt;TD class="r data"&gt;1&lt;/TD&gt;
&lt;TD class="r data"&gt;20119&lt;/TD&gt;
&lt;TD class="r data"&gt;1&lt;/TD&gt;
&lt;TD class="r data"&gt;1&lt;/TD&gt;
&lt;TD class="r data"&gt;1&lt;/TD&gt;
&lt;TD class="r data"&gt;0&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TH class="r rowheader" scope="row"&gt;4&lt;/TH&gt;
&lt;TD class="data"&gt;m13&lt;/TD&gt;
&lt;TD class="r data"&gt;2&lt;/TD&gt;
&lt;TD class="r data"&gt;20231&lt;/TD&gt;
&lt;TD class="r data"&gt;1&lt;/TD&gt;
&lt;TD class="r data"&gt;1&lt;/TD&gt;
&lt;TD class="r data"&gt;0&lt;/TD&gt;
&lt;TD class="r data"&gt;1&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TH class="r rowheader" scope="row"&gt;5&lt;/TH&gt;
&lt;TD class="data"&gt;m14&lt;/TD&gt;
&lt;TD class="r data"&gt;1&lt;/TD&gt;
&lt;TD class="r data"&gt;20500&lt;/TD&gt;
&lt;TD class="r data"&gt;1&lt;/TD&gt;
&lt;TD class="r data"&gt;1&lt;/TD&gt;
&lt;TD class="r data"&gt;1&lt;/TD&gt;
&lt;TD class="r data"&gt;0&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TH class="r rowheader" scope="row"&gt;6&lt;/TH&gt;
&lt;TD class="data"&gt;m14&lt;/TD&gt;
&lt;TD class="r data"&gt;2&lt;/TD&gt;
&lt;TD class="r data"&gt;20600&lt;/TD&gt;
&lt;TD class="r data"&gt;1&lt;/TD&gt;
&lt;TD class="r data"&gt;1&lt;/TD&gt;
&lt;TD class="r data"&gt;0&lt;/TD&gt;
&lt;TD class="r data"&gt;1&lt;/TD&gt;
&lt;/TR&gt;
&lt;/TBODY&gt;
&lt;/TABLE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Wed, 19 Jul 2017 00:50:20 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Longitudinal-calculation-across-observations/m-p/377156#M90546</guid>
      <dc:creator>Reeza</dc:creator>
      <dc:date>2017-07-19T00:50:20Z</dc:date>
    </item>
    <item>
      <title>Re: Longitudinal calculation across observations</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Longitudinal-calculation-across-observations/m-p/377157#M90547</link>
      <description>&lt;P&gt;If you have pairs of observations, the dif function may interest you.&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;    
data DEMO1; 
  set DEMO;
  by UID ;
  LAGTIME = dif(ADMISSION_DATE);
  if last.UID then output;
run;&lt;/CODE&gt;&lt;/PRE&gt;</description>
      <pubDate>Wed, 19 Jul 2017 01:30:05 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Longitudinal-calculation-across-observations/m-p/377157#M90547</guid>
      <dc:creator>ChrisNZ</dc:creator>
      <dc:date>2017-07-19T01:30:05Z</dc:date>
    </item>
    <item>
      <title>Re: Longitudinal calculation across observations</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Longitudinal-calculation-across-observations/m-p/377315#M90590</link>
      <description>&lt;P&gt;Thanks a lot. Below codes suggested worked out. It outputs half of the data with lagtime between same UID which I wanted. However, I'd like to retain whole dataset. For that purpose when I eliminate:&lt;/P&gt;&lt;PRE&gt;&lt;CODE class=" language-sas"&gt; IF last.UID THEN OUTPUT;&lt;/CODE&gt;&lt;/PRE&gt;&lt;P&gt;output is not truncated to the last obs of UID but it contains lagtime between adjacent but different UIDs which i do not need. To get back to the whole dataset I merge the lagtime output data to the original one.&amp;nbsp;&lt;/P&gt;&lt;P&gt;I wonder, if there is a way to output whole dataset with lagtime within same UID but no unnessecary lagtime calculated between different UIDs? &amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;proc sort data=demo;
by UID; 

DATA demo1; SET demo;
 BY UID;
 RETAIN R_admission_startdate;
 IF FIRST.UID THEN DO;
 R_admission_startdate = admission_startdate;
 END;
 IF LAST.UID THEN DO;
 lagtime = admission_startdate - R_admission_startdate;
 OUTPUT;
 END;
 DROP R_: ; 
 RUN;&lt;/CODE&gt;&lt;/PRE&gt;&lt;P&gt;Using lag function:&lt;/P&gt;&lt;PRE&gt;&lt;CODE class=" language-sas"&gt; data demo1; set demo;
  by UID;
  LAGTIME = admission_startdate-lag(admission_startdate);
  IF last.UID THEN OUTPUT;
  run;&lt;/CODE&gt;&lt;/PRE&gt;&lt;P&gt;Thank you all.&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;My final code then is:&lt;/P&gt;&lt;PRE&gt;&lt;CODE class=" language-sas"&gt; data have1(drop=admission_startdate); set have(keep=UID admission_startdate);
  by UID;
  LAGTIME = admission_startdate-lag(admission_startdate);
  IF last.UID THEN OUTPUT;
  run;

data want;
merge
    doh.have  (in=a)
    doh.have1 (in=b);
by UID; 
if a and b then output;
run;
 &lt;/CODE&gt;&lt;/PRE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Wed, 19 Jul 2017 13:45:20 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Longitudinal-calculation-across-observations/m-p/377315#M90590</guid>
      <dc:creator>Cruise</dc:creator>
      <dc:date>2017-07-19T13:45:20Z</dc:date>
    </item>
  </channel>
</rss>

