<?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: Assigning episode number based on group, program and conditions in SAS Programming</title>
    <link>https://communities.sas.com/t5/SAS-Programming/Assigning-episode-number-based-on-group-program-and-conditions/m-p/884890#M349589</link>
    <description>&lt;P&gt;Thank you! Apologies, I was trying to create a model dataset. What I actually "have" is what is displayed above MINUS the "episode" and "Dif_days" columns.&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;And regarding the sorting, I was manually populating an example so accidentally did have c next to a program a! So in the dataset I am working with that is actually sorted. My apologies!&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
    <pubDate>Fri, 14 Jul 2023 21:59:02 GMT</pubDate>
    <dc:creator>cdubs</dc:creator>
    <dc:date>2023-07-14T21:59:02Z</dc:date>
    <item>
      <title>Assigning episode number based on group, program and conditions</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Assigning-episode-number-based-on-group-program-and-conditions/m-p/884752#M349548</link>
      <description>&lt;P&gt;Thanks all in advance of helping.&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;The dataset I want would look like this:&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE&gt;data want;
input ID $ program $ admit $ discharge $ dif_days $ episode;
cards;
1 a 31DEC2017 31DEC2017 . 1
1 a 31DEC2017 01JAN2018 0 1
1 a 16APR2020 16APR2020 836 2
1 a 16APR2020 16APR2020 0 2
1 b 28MAR2020 28MAR2020 -19 3
1 b 28MAR2020 31MAR2020 0 3
1 b 29MAR2020 29MAR2020 -2 3
1 b 30MAR2020 30MAR2020 1 3
2 c 16JUN2015 16JUN2016 -1766 1
2 a 03UL2018 03JUL2018 1113 2
2 a 06JUL2018 06JUL2018 3 3
;run;&lt;/PRE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;What I have is essentially absent the column dif_days and episode.&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;I want a new episode assignment (within each ID, resets with each new ID) with the following logic;&amp;nbsp;&lt;/P&gt;&lt;P&gt;1) First id gets episode 1&amp;nbsp;&lt;/P&gt;&lt;P&gt;2) If the difference in days is greater than 1 absolute difference, episode value + 1&amp;nbsp;&lt;/P&gt;&lt;P&gt;3) If program name is different (all within one id), episode value + 1&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;The dataset is currently sorted by id program admit&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;However, with my current code its giving an output of the following&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE&gt;	data want;
		set have;
		by id program; 
		format dif_days episode 8.;
		dif_days = admit- lag(discharge);
	        retain episode;
		if first.id then episode=1; 
		   else if id ne lag(id) then episode+1; 
	           else if dif_days &amp;gt;1 then episode+1;
		   else episode = lag(episode);
         run;&lt;/PRE&gt;&lt;P&gt;and what I get is this:&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE&gt;data have;
  input ID $ program $ admit $ discharge $ dif_days $ episode;
cards;
1 a 31DEC2017 31DEC2017 . 1
1 a 31DEC2017 01JAN2018 0 2 
1 a 16APR2020 16APR2020 836 3
1 a 16APR2020 16APR2020 0 .
1 b 28MAR2020 28MAR2020 -19 3 
1 b 28MAR2020 31MAR2020 0 . 
1 b 29MAR2020 29MAR2020 -2 3
1 b 30MAR2020 30MAR2020 1 . 
2 c 16JUN2015 16JUN2016 -1766 1 
2 a 03UL2018 03JUL2018 1113 2 
2 a 06JUL2018 06JUL2018 3 3
;run;&lt;/PRE&gt;&lt;P&gt;I'm not sure why the second row is getting a 2 (none of the episode + 1 conditions are met?)&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Ultimately, I'm trying to come up with a beginning and end date for all episodes and this is just the first step...&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE&gt;&lt;CODE class=""&gt;data want;
input ID $ program $ admit_final $ discharge_final $ episode;
cards;
1 a 31DEC2017 01DEC2018 1
1 a 16APR2020 16APR2020 2
1 b 28MAR2020 31MAR2020 3
2 c 16JUN2015 16JUN2016 1
2 a 03UL2018 03JUL2018 2
2 a 06JUL2018 06JUL2018 3 3
;run;&lt;/CODE&gt;&lt;/PRE&gt;&lt;P&gt;I've tried applying some of the logic &lt;A href="http://&amp;nbsp;https://communities.sas.com/t5/SAS-Programming/Code-sequential-observations-into-episodes-characterize-episodes/td-p/459404" target="_self"&gt;here&lt;/A&gt;&amp;nbsp;but not working...&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Thank you all for helping this SAS beginner!&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Fri, 14 Jul 2023 07:05:16 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Assigning-episode-number-based-on-group-program-and-conditions/m-p/884752#M349548</guid>
      <dc:creator>cdubs</dc:creator>
      <dc:date>2023-07-14T07:05:16Z</dc:date>
    </item>
    <item>
      <title>Re: Assigning episode number based on group, program and conditions</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Assigning-episode-number-based-on-group-program-and-conditions/m-p/884759#M349553</link>
      <description>&lt;BLOCKQUOTE&gt;
&lt;P&gt;2) If the difference in days is greater than 1 absolute difference, episode value + 1&lt;/P&gt;
&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;This requires more explanation. What difference are you referring to?&lt;/P&gt;</description>
      <pubDate>Fri, 14 Jul 2023 09:56:33 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Assigning-episode-number-based-on-group-program-and-conditions/m-p/884759#M349553</guid>
      <dc:creator>PaigeMiller</dc:creator>
      <dc:date>2023-07-14T09:56:33Z</dc:date>
    </item>
    <item>
      <title>Re: Assigning episode number based on group, program and conditions</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Assigning-episode-number-based-on-group-program-and-conditions/m-p/884760#M349554</link>
      <description>Your code is confusing. In both the have and want datasets you have the column/variable 'episode'! In the have dataset you have the column 'dif_days' but you also calculate 'dif_days' for the want dataset. In the code for the want you use 'by id program' but that seems incorrect since the first observation for ID has program c and the next has program a. Please revisit your code snippets and revise them so that 'have' and 'want' have the columns you need and rethink the sort condition.</description>
      <pubDate>Fri, 14 Jul 2023 09:58:11 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Assigning-episode-number-based-on-group-program-and-conditions/m-p/884760#M349554</guid>
      <dc:creator>JosvanderVelden</dc:creator>
      <dc:date>2023-07-14T09:58:11Z</dc:date>
    </item>
    <item>
      <title>Re: Assigning episode number based on group, program and conditions</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Assigning-episode-number-based-on-group-program-and-conditions/m-p/884769#M349558</link>
      <description>&lt;P&gt;Hello&amp;nbsp;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/174079"&gt;@cdubs&lt;/a&gt;,&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Assuming a slightly modified HAVE dataset ...&lt;/P&gt;
&lt;PRE&gt;data have;
input ID $ program $ admit &lt;FONT color="#FF0000"&gt;:date.&lt;/FONT&gt; discharge &lt;FONT color="#FF0000"&gt;:date.&lt;/FONT&gt;;
&lt;FONT color="#FF0000"&gt;format admit discharge date9.;&lt;/FONT&gt;
cards;
1 a 31DEC2017 31DEC2017
1 a 31DEC2017 01JAN2018
1 a 16APR2020 16APR2020
1 a 16APR2020 16APR2020
1 b 28MAR2020 28MAR2020
1 b 28MAR2020 31MAR2020
1 b 29MAR2020 29MAR2020
1 b 30MAR2020 30MAR2020
2 c 16JUN2015 16JUN2016
2 &lt;FONT color="#FF0000"&gt;d&lt;/FONT&gt; 03&lt;FONT color="#FF0000"&gt;&lt;STRONG&gt;J&lt;/STRONG&gt;&lt;/FONT&gt;UL2018 03JUL2018
2 &lt;FONT color="#FF0000"&gt;d&lt;/FONT&gt; 06JUL2018 06JUL2018
;&lt;/PRE&gt;
&lt;P&gt;&amp;nbsp;... and that the only purpose of variable &lt;FONT face="courier new,courier"&gt;dif_days&lt;/FONT&gt; would be to compute &lt;FONT face="courier new,courier"&gt;episode&lt;/FONT&gt;, I suggest this:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data want(drop=prev_dis);
set have;
by id program;
prev_dis=lag(discharge);
if first.id then episode=1;
else if first.program | admit-prev_dis&amp;gt;1 then episode+1;
run;

proc summary data=want;
by id program episode;
var admit discharge;
output out=final(drop=_:) min(admit)=admit_final max(discharge)=discharge_final;
run;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;&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/174079"&gt;@cdubs&lt;/a&gt;&amp;nbsp;wrote:&lt;BR /&gt;
&lt;PRE&gt;	data want;
		set have;
		by id program; 
		format dif_days episode 8.;
		dif_days = admit- lag(discharge);
	        retain episode;
		if first.id then episode=1; 
		   else if id ne lag(id) then episode+1; 
	           else if dif_days &amp;gt;1 then episode+1;
		   else episode = lag(episode);
         run;&lt;/PRE&gt;
&lt;P&gt;and what I get is this:&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;data have;
  input ID $ program $ admit $ discharge $ dif_days $ episode;
cards;
1 a 31DEC2017 31DEC2017 . 1
1 a 31DEC2017 01JAN2018 0 2 
1 a 16APR2020 16APR2020 836 3
1 a 16APR2020 16APR2020 0 .
1 b 28MAR2020 28MAR2020 -19 3 
1 b 28MAR2020 31MAR2020 0 . 
1 b 29MAR2020 29MAR2020 -2 3
1 b 30MAR2020 30MAR2020 1 . 
2 c 16JUN2015 16JUN2016 -1766 1 
2 a 03UL2018 03JUL2018 1113 2 
2 a 06JUL2018 06JUL2018 3 3
;run;&lt;/PRE&gt;
&lt;P&gt;I'm not sure why the second row is getting a 2 (none of the episode + 1 conditions are met?)&amp;nbsp;&amp;nbsp;&lt;/P&gt;
&lt;HR /&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;This is because &lt;FONT face="courier new,courier"&gt;lag(id)&lt;/FONT&gt; is evaluated in the second observation for the &lt;EM&gt;first&lt;/EM&gt; time (the ELSE condition was not met in the first observation!). It returns a missing value, which is different from the current &lt;FONT face="courier new,courier"&gt;id&lt;/FONT&gt; value, hence &lt;FONT face="courier new,courier"&gt;episode&lt;/FONT&gt; is incremented. Note the &lt;EM&gt;unconditional&lt;/EM&gt; use of the LAG function in my suggested DATA step.&lt;/P&gt;</description>
      <pubDate>Fri, 14 Jul 2023 10:41:46 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Assigning-episode-number-based-on-group-program-and-conditions/m-p/884769#M349558</guid>
      <dc:creator>FreelanceReinh</dc:creator>
      <dc:date>2023-07-14T10:41:46Z</dc:date>
    </item>
    <item>
      <title>Re: Assigning episode number based on group, program and conditions</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Assigning-episode-number-based-on-group-program-and-conditions/m-p/884890#M349589</link>
      <description>&lt;P&gt;Thank you! Apologies, I was trying to create a model dataset. What I actually "have" is what is displayed above MINUS the "episode" and "Dif_days" columns.&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;And regarding the sorting, I was manually populating an example so accidentally did have c next to a program a! So in the dataset I am working with that is actually sorted. My apologies!&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Fri, 14 Jul 2023 21:59:02 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Assigning-episode-number-based-on-group-program-and-conditions/m-p/884890#M349589</guid>
      <dc:creator>cdubs</dc:creator>
      <dc:date>2023-07-14T21:59:02Z</dc:date>
    </item>
    <item>
      <title>Re: Assigning episode number based on group, program and conditions</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Assigning-episode-number-based-on-group-program-and-conditions/m-p/884900#M349599</link>
      <description>&lt;P&gt;Your code can't work at all, as you can't make calculations with those strings that look like dates. After converting the strings to dates, do this:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data want;
set have;
by id program;
retain episode;
if first.id then episode = 0;
if first.program or admit - lag(discharge) &amp;gt; 0 then episode + 1;
run;&lt;/CODE&gt;&lt;/PRE&gt;</description>
      <pubDate>Sat, 15 Jul 2023 06:48:19 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Assigning-episode-number-based-on-group-program-and-conditions/m-p/884900#M349599</guid>
      <dc:creator>Kurt_Bremser</dc:creator>
      <dc:date>2023-07-15T06:48:19Z</dc:date>
    </item>
  </channel>
</rss>

