<?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: create cycle windows from start and end date in SAS Programming</title>
    <link>https://communities.sas.com/t5/SAS-Programming/create-cycle-windows-from-start-and-end-date/m-p/438790#M109437</link>
    <description>&lt;P&gt;Hi&lt;/P&gt;
&lt;P&gt;That is a bit tricky, because it requires the opposite of LAG, and there are no look-ahead functions in SAS, has probably something to do with&amp;nbsp;the way observations are brought into the program vector. But years back a smart guy came up with a solution at a SAS conference.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;So&amp;nbsp;here wo go:&lt;/P&gt;
&lt;PRE&gt;* Test data;
data have;
	length Visit $10 Date 8;
	format date date9.;
	Visit = 'C1 Day 1';	DATE='01AUG2017'd; output;
	Visit = 'C1 Day 5';	DATE='04AUG2017'd; output;
	Visit = 'C2 Day 1';	DATE='15AUG2017'd; output;
	Visit = 'C2 Day 5';	DATE='19AUG2017'd; output;
	Visit = 'C3 Day 1';	DATE='25AUG2017'd; output;
	Visit = 'C3 Day 15';DATE='05SEP2017'd; output;
	Visit = 'C4 Day 1';DATE='10SEP2017'd; output;
run;

* Create Cycle variable and make sure input is in right order;;
proc sql;
	create table inter1 as
		select Visit, Date,
		Tranwrd(scan(Visit,1,' '),'C','Cycle ') as Cycle
	from want
	order by Cycle, Date;
quit;

* Set start and end; 
* Trick simulating look-ahead by using 2 set statements, one with firstobs=2; 
data inter2 (keep=Cycle CycleStart CycleEnd);
	format CycleStart cycleEnd date9.;
	retain CycleStart;

	if eof=0 then set inter1(firstobs=2 keep=Cycle Date rename=(Cycle=nextCycle date=nextDate)) end=eof;

	set inter1; by Cycle;
	if first.Cycle then cycleStart = Date;
	if last.Cycle then do;
		cycleEnd = nextDate-1;
		if cycleStart &amp;lt; cycleEnd then output;
	end;
run;

* Join all cycles/dates with start/end;
proc sql;
	create table want as
		select 
		a.Visit, 
		a.Date,
		b.Cycle,
		b.cycleStart,
		b.cycleEnd
	from inter1 as a left join inter2 as b
	on a.Cycle = b.Cycle
	order by 
		a.Cycle, 
		a.Date;
quit;
&lt;/PRE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
    <pubDate>Tue, 20 Feb 2018 20:38:45 GMT</pubDate>
    <dc:creator>ErikLund_Jensen</dc:creator>
    <dc:date>2018-02-20T20:38:45Z</dc:date>
    <item>
      <title>create cycle windows from start and end date</title>
      <link>https://communities.sas.com/t5/SAS-Programming/create-cycle-windows-from-start-and-end-date/m-p/438738#M109417</link>
      <description>&lt;P&gt;Hi all,&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;I would like to create cycle windows for variables that contain several 'day' timepoints within one cycle.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;So, I have values that look like this:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;TABLE width="215"&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD width="105"&gt;Visit&lt;/TD&gt;
&lt;TD width="110"&gt;DATE&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;C1 Day 1&lt;/TD&gt;
&lt;TD&gt;01AUG2017&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;C1 Day&amp;nbsp; 5&lt;/TD&gt;
&lt;TD&gt;04AUG2017&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;C2 Day 1&lt;/TD&gt;
&lt;TD&gt;15AUG2017&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;C2 Day 5&lt;/TD&gt;
&lt;TD&gt;19AUG2017&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;C3 Day 1&lt;/TD&gt;
&lt;TD&gt;25AUG2017&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;C3 Day 15&lt;/TD&gt;
&lt;TD&gt;05SEP2017&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;C4 Day 1&lt;/TD&gt;
&lt;TD&gt;10SEP2017&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;And I would like to create new variables that display the start and end date within each cycle- where the end date is one day before the start of the next cycle.&amp;nbsp; New variables:&amp;nbsp; Cycle, Cycle Start, Cycle End.&amp;nbsp; I'm not sure how to get&amp;nbsp;the end date.&amp;nbsp; Maybe with lag or something?&amp;nbsp; Any help is greatly appreciated!!&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;This is the logic...&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;TABLE width="529"&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD width="105"&gt;Visit&lt;/TD&gt;
&lt;TD width="110"&gt;DATE&lt;/TD&gt;
&lt;TD width="110"&gt;CYCLE&lt;/TD&gt;
&lt;TD width="98"&gt;CYCLE START&lt;/TD&gt;
&lt;TD width="106"&gt;CYCLE END&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;C1 Day 1&lt;/TD&gt;
&lt;TD&gt;01AUG2017&lt;/TD&gt;
&lt;TD&gt;Cycle 1&lt;/TD&gt;
&lt;TD&gt;01AUG2015&lt;/TD&gt;
&lt;TD&gt;14AUG2017&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;C1 Day&amp;nbsp; 5&lt;/TD&gt;
&lt;TD&gt;04AUG2017&lt;/TD&gt;
&lt;TD&gt;Cycle 1&lt;/TD&gt;
&lt;TD&gt;01AUG2015&lt;/TD&gt;
&lt;TD&gt;14AUG2015&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;C2 Day 1&lt;/TD&gt;
&lt;TD&gt;15AUG2017&lt;/TD&gt;
&lt;TD&gt;Cycle 2&lt;/TD&gt;
&lt;TD&gt;15AUG2017&lt;/TD&gt;
&lt;TD&gt;24AUG2017&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;C2 Day 5&lt;/TD&gt;
&lt;TD&gt;19AUG2017&lt;/TD&gt;
&lt;TD&gt;Cycle 2&lt;/TD&gt;
&lt;TD&gt;15AUG2017&lt;/TD&gt;
&lt;TD&gt;24AUG2017&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;C3 Day 1&lt;/TD&gt;
&lt;TD&gt;25AUG2017&lt;/TD&gt;
&lt;TD&gt;Cycle 3&lt;/TD&gt;
&lt;TD&gt;25AUG2017&lt;/TD&gt;
&lt;TD&gt;09SEP2017&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;C3 Day 15&lt;/TD&gt;
&lt;TD&gt;05SEP2017&lt;/TD&gt;
&lt;TD&gt;Cycle 3&lt;/TD&gt;
&lt;TD&gt;25AUG2017&lt;/TD&gt;
&lt;TD&gt;09SEP2017&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;C4 Day 1&lt;/TD&gt;
&lt;TD&gt;10SEP2017&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;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;but this is how it should look so I can join to other tables:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;TABLE width="318"&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD width="110"&gt;CYCLE&amp;nbsp;&lt;/TD&gt;
&lt;TD width="110"&gt;CYCLE_START&lt;/TD&gt;
&lt;TD width="98"&gt;CYCLE_END&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;C1&lt;/TD&gt;
&lt;TD&gt;01AUG2015&lt;/TD&gt;
&lt;TD&gt;14AUG2017&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;C2&lt;/TD&gt;
&lt;TD&gt;15AUG2017&lt;/TD&gt;
&lt;TD&gt;24AUG2017&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;C3&lt;/TD&gt;
&lt;TD&gt;25AUG2017&lt;/TD&gt;
&lt;TD&gt;09SEP2017&lt;/TD&gt;
&lt;/TR&gt;
&lt;/TBODY&gt;
&lt;/TABLE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Here is where I started for the start date...&lt;BR /&gt;data&amp;nbsp;want&lt;BR /&gt;set have (keep=patient visit vsdat);&lt;BR /&gt; if scan(visit,3)='1' then do;&lt;BR /&gt; cycle_start=date;&lt;BR /&gt; Cycle=scan(visit,1);&lt;/P&gt;</description>
      <pubDate>Tue, 20 Feb 2018 18:12:15 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/create-cycle-windows-from-start-and-end-date/m-p/438738#M109417</guid>
      <dc:creator>jenim514</dc:creator>
      <dc:date>2018-02-20T18:12:15Z</dc:date>
    </item>
    <item>
      <title>Re: create cycle windows from start and end date</title>
      <link>https://communities.sas.com/t5/SAS-Programming/create-cycle-windows-from-start-and-end-date/m-p/438745#M109419</link>
      <description>&lt;P&gt;You show that you know you need lag but you don't have any usage of that in your code.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Can you show an attempt at using LAG or RETAIN?&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/59697"&gt;@jenim514&lt;/a&gt; wrote:&lt;BR /&gt;
&lt;P&gt;Hi all,&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;I would like to create cycle windows for variables that contain several 'day' timepoints within one cycle.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;So, I have values that look like this:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;TABLE width="215"&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD width="105"&gt;Visit&lt;/TD&gt;
&lt;TD width="110"&gt;DATE&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;C1 Day 1&lt;/TD&gt;
&lt;TD&gt;01AUG2017&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;C1 Day&amp;nbsp; 5&lt;/TD&gt;
&lt;TD&gt;04AUG2017&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;C2 Day 1&lt;/TD&gt;
&lt;TD&gt;15AUG2017&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;C2 Day 5&lt;/TD&gt;
&lt;TD&gt;19AUG2017&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;C3 Day 1&lt;/TD&gt;
&lt;TD&gt;25AUG2017&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;C3 Day 15&lt;/TD&gt;
&lt;TD&gt;05SEP2017&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;C4 Day 1&lt;/TD&gt;
&lt;TD&gt;10SEP2017&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;And I would like to create new variables that display the start and end date within each cycle- where the end date is one day before the start of the next cycle.&amp;nbsp; New variables:&amp;nbsp; Cycle, Cycle Start, Cycle End.&amp;nbsp; I'm not sure how to get&amp;nbsp;the end date.&amp;nbsp; Maybe with lag or something?&amp;nbsp; Any help is greatly appreciated!!&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;This is the logic...&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;TABLE width="529"&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD width="105"&gt;Visit&lt;/TD&gt;
&lt;TD width="110"&gt;DATE&lt;/TD&gt;
&lt;TD width="110"&gt;CYCLE&lt;/TD&gt;
&lt;TD width="98"&gt;CYCLE START&lt;/TD&gt;
&lt;TD width="106"&gt;CYCLE END&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;C1 Day 1&lt;/TD&gt;
&lt;TD&gt;01AUG2017&lt;/TD&gt;
&lt;TD&gt;Cycle 1&lt;/TD&gt;
&lt;TD&gt;01AUG2015&lt;/TD&gt;
&lt;TD&gt;14AUG2017&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;C1 Day&amp;nbsp; 5&lt;/TD&gt;
&lt;TD&gt;04AUG2017&lt;/TD&gt;
&lt;TD&gt;Cycle 1&lt;/TD&gt;
&lt;TD&gt;01AUG2015&lt;/TD&gt;
&lt;TD&gt;14AUG2015&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;C2 Day 1&lt;/TD&gt;
&lt;TD&gt;15AUG2017&lt;/TD&gt;
&lt;TD&gt;Cycle 2&lt;/TD&gt;
&lt;TD&gt;15AUG2017&lt;/TD&gt;
&lt;TD&gt;24AUG2017&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;C2 Day 5&lt;/TD&gt;
&lt;TD&gt;19AUG2017&lt;/TD&gt;
&lt;TD&gt;Cycle 2&lt;/TD&gt;
&lt;TD&gt;15AUG2017&lt;/TD&gt;
&lt;TD&gt;24AUG2017&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;C3 Day 1&lt;/TD&gt;
&lt;TD&gt;25AUG2017&lt;/TD&gt;
&lt;TD&gt;Cycle 3&lt;/TD&gt;
&lt;TD&gt;25AUG2017&lt;/TD&gt;
&lt;TD&gt;09SEP2017&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;C3 Day 15&lt;/TD&gt;
&lt;TD&gt;05SEP2017&lt;/TD&gt;
&lt;TD&gt;Cycle 3&lt;/TD&gt;
&lt;TD&gt;25AUG2017&lt;/TD&gt;
&lt;TD&gt;09SEP2017&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;C4 Day 1&lt;/TD&gt;
&lt;TD&gt;10SEP2017&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;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;but this is how it should look so I can join to other tables:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;TABLE width="318"&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD width="110"&gt;CYCLE&amp;nbsp;&lt;/TD&gt;
&lt;TD width="110"&gt;CYCLE_START&lt;/TD&gt;
&lt;TD width="98"&gt;CYCLE_END&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;C1&lt;/TD&gt;
&lt;TD&gt;01AUG2015&lt;/TD&gt;
&lt;TD&gt;14AUG2017&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;C2&lt;/TD&gt;
&lt;TD&gt;15AUG2017&lt;/TD&gt;
&lt;TD&gt;24AUG2017&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;C3&lt;/TD&gt;
&lt;TD&gt;25AUG2017&lt;/TD&gt;
&lt;TD&gt;09SEP2017&lt;/TD&gt;
&lt;/TR&gt;
&lt;/TBODY&gt;
&lt;/TABLE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Here is where I started for the start date...&lt;BR /&gt;data&amp;nbsp;want&lt;BR /&gt;set have (keep=patient visit vsdat);&lt;BR /&gt; if scan(visit,3)='1' then do;&lt;BR /&gt; cycle_start=date;&lt;BR /&gt; Cycle=scan(visit,1);&lt;/P&gt;
&lt;HR /&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Tue, 20 Feb 2018 18:38:50 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/create-cycle-windows-from-start-and-end-date/m-p/438745#M109419</guid>
      <dc:creator>Reeza</dc:creator>
      <dc:date>2018-02-20T18:38:50Z</dc:date>
    </item>
    <item>
      <title>Re: create cycle windows from start and end date</title>
      <link>https://communities.sas.com/t5/SAS-Programming/create-cycle-windows-from-start-and-end-date/m-p/438790#M109437</link>
      <description>&lt;P&gt;Hi&lt;/P&gt;
&lt;P&gt;That is a bit tricky, because it requires the opposite of LAG, and there are no look-ahead functions in SAS, has probably something to do with&amp;nbsp;the way observations are brought into the program vector. But years back a smart guy came up with a solution at a SAS conference.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;So&amp;nbsp;here wo go:&lt;/P&gt;
&lt;PRE&gt;* Test data;
data have;
	length Visit $10 Date 8;
	format date date9.;
	Visit = 'C1 Day 1';	DATE='01AUG2017'd; output;
	Visit = 'C1 Day 5';	DATE='04AUG2017'd; output;
	Visit = 'C2 Day 1';	DATE='15AUG2017'd; output;
	Visit = 'C2 Day 5';	DATE='19AUG2017'd; output;
	Visit = 'C3 Day 1';	DATE='25AUG2017'd; output;
	Visit = 'C3 Day 15';DATE='05SEP2017'd; output;
	Visit = 'C4 Day 1';DATE='10SEP2017'd; output;
run;

* Create Cycle variable and make sure input is in right order;;
proc sql;
	create table inter1 as
		select Visit, Date,
		Tranwrd(scan(Visit,1,' '),'C','Cycle ') as Cycle
	from want
	order by Cycle, Date;
quit;

* Set start and end; 
* Trick simulating look-ahead by using 2 set statements, one with firstobs=2; 
data inter2 (keep=Cycle CycleStart CycleEnd);
	format CycleStart cycleEnd date9.;
	retain CycleStart;

	if eof=0 then set inter1(firstobs=2 keep=Cycle Date rename=(Cycle=nextCycle date=nextDate)) end=eof;

	set inter1; by Cycle;
	if first.Cycle then cycleStart = Date;
	if last.Cycle then do;
		cycleEnd = nextDate-1;
		if cycleStart &amp;lt; cycleEnd then output;
	end;
run;

* Join all cycles/dates with start/end;
proc sql;
	create table want as
		select 
		a.Visit, 
		a.Date,
		b.Cycle,
		b.cycleStart,
		b.cycleEnd
	from inter1 as a left join inter2 as b
	on a.Cycle = b.Cycle
	order by 
		a.Cycle, 
		a.Date;
quit;
&lt;/PRE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Tue, 20 Feb 2018 20:38:45 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/create-cycle-windows-from-start-and-end-date/m-p/438790#M109437</guid>
      <dc:creator>ErikLund_Jensen</dc:creator>
      <dc:date>2018-02-20T20:38:45Z</dc:date>
    </item>
    <item>
      <title>Re: create cycle windows from start and end date</title>
      <link>https://communities.sas.com/t5/SAS-Programming/create-cycle-windows-from-start-and-end-date/m-p/438800#M109445</link>
      <description>&lt;P&gt;Maybe this is a little easier to work with.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;I created a sequence variable based on the cycle and day within each subject.&amp;nbsp; When a new cycle starts, sequence resets to 1.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;I would like to ouput the visdat as the start or end date&amp;nbsp; based on the sequence in each cycle.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;So, i have formatted data to look like this:&lt;/P&gt;
&lt;TABLE width="664"&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD width="64"&gt;Obs&lt;/TD&gt;
&lt;TD width="83"&gt;PATIENT&lt;/TD&gt;
&lt;TD width="110"&gt;VISIT&lt;/TD&gt;
&lt;TD width="139"&gt;VISDAT&lt;/TD&gt;
&lt;TD width="98"&gt;CYCX&lt;/TD&gt;
&lt;TD width="106"&gt;DAYX&lt;/TD&gt;
&lt;TD width="64"&gt;CSEQ&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;1&lt;/TD&gt;
&lt;TD&gt;A&lt;/TD&gt;
&lt;TD&gt;Cycle 1 Day 1&lt;/TD&gt;
&lt;TD&gt;14NOV2017&lt;/TD&gt;
&lt;TD&gt;1&lt;/TD&gt;
&lt;TD&gt;1&lt;/TD&gt;
&lt;TD&gt;1&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;2&lt;/TD&gt;
&lt;TD&gt;A&lt;/TD&gt;
&lt;TD&gt;Cycle 1 Day 8&lt;/TD&gt;
&lt;TD&gt;21NOV2017&lt;/TD&gt;
&lt;TD&gt;1&lt;/TD&gt;
&lt;TD&gt;8&lt;/TD&gt;
&lt;TD&gt;2&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;3&lt;/TD&gt;
&lt;TD&gt;A&lt;/TD&gt;
&lt;TD&gt;Cycle 1 Day 15&lt;/TD&gt;
&lt;TD&gt;28NOV2017&lt;/TD&gt;
&lt;TD&gt;1&lt;/TD&gt;
&lt;TD&gt;15&lt;/TD&gt;
&lt;TD&gt;3&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;4&lt;/TD&gt;
&lt;TD&gt;A&lt;/TD&gt;
&lt;TD&gt;Cycle 1 Day 22&lt;/TD&gt;
&lt;TD&gt;06DEC2017&lt;/TD&gt;
&lt;TD&gt;1&lt;/TD&gt;
&lt;TD&gt;22&lt;/TD&gt;
&lt;TD&gt;4&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;5&lt;/TD&gt;
&lt;TD&gt;A&lt;/TD&gt;
&lt;TD&gt;Cycle 2 Day 1&lt;/TD&gt;
&lt;TD&gt;13DEC2017&lt;/TD&gt;
&lt;TD&gt;2&lt;/TD&gt;
&lt;TD&gt;1&lt;/TD&gt;
&lt;TD&gt;1&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;6&lt;/TD&gt;
&lt;TD&gt;A&lt;/TD&gt;
&lt;TD&gt;Cycle 3 Day 1&lt;/TD&gt;
&lt;TD&gt;22DEC2017&lt;/TD&gt;
&lt;TD&gt;3&lt;/TD&gt;
&lt;TD&gt;1&lt;/TD&gt;
&lt;TD&gt;1&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;7&lt;/TD&gt;
&lt;TD&gt;B&lt;/TD&gt;
&lt;TD&gt;Cycle 1 Day 1&lt;/TD&gt;
&lt;TD&gt;14NOV2017&lt;/TD&gt;
&lt;TD&gt;1&lt;/TD&gt;
&lt;TD&gt;1&lt;/TD&gt;
&lt;TD&gt;1&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;8&lt;/TD&gt;
&lt;TD&gt;B&lt;/TD&gt;
&lt;TD&gt;Cycle 1 Day 8&lt;/TD&gt;
&lt;TD&gt;21NOV2017&lt;/TD&gt;
&lt;TD&gt;1&lt;/TD&gt;
&lt;TD&gt;8&lt;/TD&gt;
&lt;TD&gt;2&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;9&lt;/TD&gt;
&lt;TD&gt;B&lt;/TD&gt;
&lt;TD&gt;Cycle 1 Day 15&lt;/TD&gt;
&lt;TD&gt;28NOV2017&lt;/TD&gt;
&lt;TD&gt;1&lt;/TD&gt;
&lt;TD&gt;15&lt;/TD&gt;
&lt;TD&gt;3&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;10&lt;/TD&gt;
&lt;TD&gt;B&lt;/TD&gt;
&lt;TD&gt;Cycle 1 Day 22&lt;/TD&gt;
&lt;TD&gt;06DEC2017&lt;/TD&gt;
&lt;TD&gt;1&lt;/TD&gt;
&lt;TD&gt;22&lt;/TD&gt;
&lt;TD&gt;4&lt;/TD&gt;
&lt;/TR&gt;
&lt;/TBODY&gt;
&lt;/TABLE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;I would like this code (this is my attempt but all the dates are populating start and end...not just the first and last in each cycle):&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;data vs5;&lt;BR /&gt;set vs4;&lt;BR /&gt;by patient cycx cseq;&lt;BR /&gt;if first.cseq then cycle_start=visdat;&lt;BR /&gt;else cycle_start=.;&lt;BR /&gt;if last.cseq then cycle_end=visdat;&lt;BR /&gt;else cycle_end=.;&lt;BR /&gt;run;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;to do this:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;TABLE width="762"&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD width="58"&gt;PATIENT&lt;/TD&gt;
&lt;TD width="155"&gt;VISIT&lt;/TD&gt;
&lt;TD width="139"&gt;VISDAT&lt;/TD&gt;
&lt;TD width="54"&gt;CYCX&lt;/TD&gt;
&lt;TD width="58"&gt;DAYX&lt;/TD&gt;
&lt;TD width="64"&gt;CSEQ&lt;/TD&gt;
&lt;TD width="119"&gt;CYCLE_START&lt;/TD&gt;
&lt;TD width="115"&gt;CYCLE_END&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;A&lt;/TD&gt;
&lt;TD&gt;Cycle 1 Day 1&lt;/TD&gt;
&lt;TD&gt;14NOV2017&lt;/TD&gt;
&lt;TD&gt;1&lt;/TD&gt;
&lt;TD&gt;1&lt;/TD&gt;
&lt;TD&gt;1&lt;/TD&gt;
&lt;TD&gt;14-Nov-17&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;A&lt;/TD&gt;
&lt;TD&gt;Cycle 1 Day 8&lt;/TD&gt;
&lt;TD&gt;21NOV2017&lt;/TD&gt;
&lt;TD&gt;1&lt;/TD&gt;
&lt;TD&gt;8&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;A&lt;/TD&gt;
&lt;TD&gt;Cycle 1 Day 15&lt;/TD&gt;
&lt;TD&gt;28NOV2017&lt;/TD&gt;
&lt;TD&gt;1&lt;/TD&gt;
&lt;TD&gt;15&lt;/TD&gt;
&lt;TD&gt;3&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;A&lt;/TD&gt;
&lt;TD&gt;Cycle 1 Day 22&lt;/TD&gt;
&lt;TD&gt;06DEC2017&lt;/TD&gt;
&lt;TD&gt;1&lt;/TD&gt;
&lt;TD&gt;22&lt;/TD&gt;
&lt;TD&gt;4&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;6-Dec-17&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;A&lt;/TD&gt;
&lt;TD&gt;Cycle 2 Day 1&lt;/TD&gt;
&lt;TD&gt;13DEC2017&lt;/TD&gt;
&lt;TD&gt;2&lt;/TD&gt;
&lt;TD&gt;1&lt;/TD&gt;
&lt;TD&gt;1&lt;/TD&gt;
&lt;TD&gt;13-Dec-17&lt;/TD&gt;
&lt;TD&gt;13-Dec-17&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;A&lt;/TD&gt;
&lt;TD&gt;Cycle 3 Day 1&lt;/TD&gt;
&lt;TD&gt;22DEC2017&lt;/TD&gt;
&lt;TD&gt;3&lt;/TD&gt;
&lt;TD&gt;1&lt;/TD&gt;
&lt;TD&gt;1&lt;/TD&gt;
&lt;TD&gt;22-Dec-17&lt;/TD&gt;
&lt;TD&gt;22-Dec-18&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;B&lt;/TD&gt;
&lt;TD&gt;Cycle 1 Day 1&lt;/TD&gt;
&lt;TD&gt;14NOV2017&lt;/TD&gt;
&lt;TD&gt;1&lt;/TD&gt;
&lt;TD&gt;1&lt;/TD&gt;
&lt;TD&gt;1&lt;/TD&gt;
&lt;TD&gt;14-Nov-17&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;B&lt;/TD&gt;
&lt;TD&gt;Cycle 1 Day 8&lt;/TD&gt;
&lt;TD&gt;21NOV2017&lt;/TD&gt;
&lt;TD&gt;1&lt;/TD&gt;
&lt;TD&gt;8&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;B&lt;/TD&gt;
&lt;TD&gt;Cycle 1 Day 15&lt;/TD&gt;
&lt;TD&gt;28NOV2017&lt;/TD&gt;
&lt;TD&gt;1&lt;/TD&gt;
&lt;TD&gt;15&lt;/TD&gt;
&lt;TD&gt;3&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;B&lt;/TD&gt;
&lt;TD&gt;Cycle 1 Day 22&lt;/TD&gt;
&lt;TD&gt;06DEC2017&lt;/TD&gt;
&lt;TD&gt;1&lt;/TD&gt;
&lt;TD&gt;22&lt;/TD&gt;
&lt;TD&gt;4&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;6-Dec-17&lt;/TD&gt;
&lt;/TR&gt;
&lt;/TBODY&gt;
&lt;/TABLE&gt;</description>
      <pubDate>Tue, 20 Feb 2018 21:03:06 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/create-cycle-windows-from-start-and-end-date/m-p/438800#M109445</guid>
      <dc:creator>jenim514</dc:creator>
      <dc:date>2018-02-20T21:03:06Z</dc:date>
    </item>
    <item>
      <title>Re: create cycle windows from start and end date</title>
      <link>https://communities.sas.com/t5/SAS-Programming/create-cycle-windows-from-start-and-end-date/m-p/438801#M109446</link>
      <description>I'm going to attempt this and let you know!&lt;BR /&gt;</description>
      <pubDate>Tue, 20 Feb 2018 21:05:13 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/create-cycle-windows-from-start-and-end-date/m-p/438801#M109446</guid>
      <dc:creator>jenim514</dc:creator>
      <dc:date>2018-02-20T21:05:13Z</dc:date>
    </item>
    <item>
      <title>Re: create cycle windows from start and end date</title>
      <link>https://communities.sas.com/t5/SAS-Programming/create-cycle-windows-from-start-and-end-date/m-p/438811#M109452</link>
      <description>&lt;P&gt;Keep it simple:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data have;
input patient $ (Visit1-Visit4) ($) DATE :date9.;
Visit = catx(" ", Visit1, Visit2, Visit3, Visit4);
format date date9.;
drop Visit1-Visit4;
datalines; 
A Cycle 1 Day 1 14NOV2017 
A Cycle 1 Day 8 21NOV2017 
A Cycle 1 Day 15 28NOV2017
A Cycle 1 Day 22 06DEC2017
A Cycle 2 Day 1 13DEC2017 
A Cycle 3 Day 1 22DEC2017 
B Cycle 1 Day 1 14NOV2017 
B Cycle 1 Day 8 21NOV2017 
B Cycle 1 Day 15 28NOV2017
B Cycle 1 Day 22 06DEC2017
;

proc sql;
create table want as
select
    patient,
    input(scan(Visit, 2), best.) as cycle,
    min(date) as cycle_start format=date9.,    
    max(date) as cycle_end format=date9.
from have
group by patient, calculated cycle;
quit;&lt;/CODE&gt;&lt;/PRE&gt;</description>
      <pubDate>Tue, 20 Feb 2018 22:09:35 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/create-cycle-windows-from-start-and-end-date/m-p/438811#M109452</guid>
      <dc:creator>PGStats</dc:creator>
      <dc:date>2018-02-20T22:09:35Z</dc:date>
    </item>
    <item>
      <title>Re: create cycle windows from start and end date</title>
      <link>https://communities.sas.com/t5/SAS-Programming/create-cycle-windows-from-start-and-end-date/m-p/438822#M109453</link>
      <description>&lt;P&gt;You want one record per complete cycle, right ?&amp;nbsp; (i.e. no cycle 4 is output because there's no cycle 5 data to establish end-of-cycle-4)&amp;nbsp;.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Then (1) only read in the "day 1" cases.&amp;nbsp; The others are noise.&amp;nbsp; (2) for each day 1 record use the lag function to get the date and id of&amp;nbsp; the prior cycle:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data want (drop=visit date );
  set have;
  where scan(visit,3)='1';
  by pat_id;
  
  cycle=lag(scan(visit,1));
  start=lag(date);
  end=date-1;
  format start end date9.;
  if first.pat_id=0;
run;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Note the subsetting "if first.pat_id=0" allows you to use lagged values yet avoid outputting a cycle at the beginning of each pat_id that is contaminated by data from the prior pat_id.&lt;/P&gt;</description>
      <pubDate>Tue, 20 Feb 2018 23:01:44 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/create-cycle-windows-from-start-and-end-date/m-p/438822#M109453</guid>
      <dc:creator>mkeintz</dc:creator>
      <dc:date>2018-02-20T23:01:44Z</dc:date>
    </item>
    <item>
      <title>Re: create cycle windows from start and end date</title>
      <link>https://communities.sas.com/t5/SAS-Programming/create-cycle-windows-from-start-and-end-date/m-p/438831#M109456</link>
      <description>&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/462"&gt;@PGStats&lt;/a&gt; this worked great!  Thank you!</description>
      <pubDate>Wed, 21 Feb 2018 00:04:51 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/create-cycle-windows-from-start-and-end-date/m-p/438831#M109456</guid>
      <dc:creator>jenim514</dc:creator>
      <dc:date>2018-02-21T00:04:51Z</dc:date>
    </item>
    <item>
      <title>Re: create cycle windows from start and end date</title>
      <link>https://communities.sas.com/t5/SAS-Programming/create-cycle-windows-from-start-and-end-date/m-p/438896#M109466</link>
      <description>&lt;P&gt;Hi&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;I like simple solutions too, and it's fine as long as jenim514 find it useful. But is does not solve the problem raised in the original question.&amp;nbsp;The problem - which made this a Little bit complicated - was&amp;nbsp;to set a Cycle End-date as the &lt;STRONG&gt;&lt;EM&gt;day before the&amp;nbsp;NEXT Cycle's Start&lt;/EM&gt;-date&lt;/STRONG&gt;, and that is not what happens.&lt;/P&gt;</description>
      <pubDate>Wed, 21 Feb 2018 09:59:40 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/create-cycle-windows-from-start-and-end-date/m-p/438896#M109466</guid>
      <dc:creator>ErikLund_Jensen</dc:creator>
      <dc:date>2018-02-21T09:59:40Z</dc:date>
    </item>
    <item>
      <title>Re: create cycle windows from start and end date</title>
      <link>https://communities.sas.com/t5/SAS-Programming/create-cycle-windows-from-start-and-end-date/m-p/439058#M109512</link>
      <description>&lt;P&gt;I actually used a combination of both your suggestions (I would accept both if i could!)&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;This was my final code&amp;nbsp; (variable&amp;nbsp;names vary from sample data provided to match actual data set)&lt;/P&gt;
&lt;P&gt;&lt;BR /&gt;proc sql;&lt;BR /&gt;create table vs5 as&lt;BR /&gt;select&lt;BR /&gt; patient, &lt;BR /&gt;/* input(scan(Visit, 2), best.) as cycle,*/&lt;BR /&gt; input (scan(cyc,1),best.) as cycle,&lt;BR /&gt; min(visdat) as cycle_start format date9., &lt;BR /&gt; max(visdat) as cycle_end format date9.&lt;BR /&gt;from vs4&lt;BR /&gt;group by patient, calculated cycle;&lt;BR /&gt;quit;&lt;/P&gt;
&lt;P&gt;proc sort data=vs5;&lt;BR /&gt;by patient cycle;&lt;BR /&gt;run;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;data cycle_end (drop=cycle_end next_start);&lt;BR /&gt;set vs5;&lt;BR /&gt;by patient;&lt;BR /&gt;set vs5 ( firstobs = 2 keep = cycle_start rename = (cycle_start = Next_start))&lt;BR /&gt; vs5 ( obs = 1 drop = _all_);&lt;BR /&gt;/*Prev_start = ifn( first.patient, (.), lag(cycle_start) );*/&lt;BR /&gt;Next_start = ifn( last.patient, (.), Next_start );&lt;BR /&gt;if next_start ^=. then new_end=next_start-1;&lt;BR /&gt;format new_end date9.;&lt;BR /&gt;if cycle=0 then new_end=cycle_start;&lt;BR /&gt;run;&lt;/P&gt;</description>
      <pubDate>Wed, 21 Feb 2018 20:24:57 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/create-cycle-windows-from-start-and-end-date/m-p/439058#M109512</guid>
      <dc:creator>jenim514</dc:creator>
      <dc:date>2018-02-21T20:24:57Z</dc:date>
    </item>
    <item>
      <title>Re: create cycle windows from start and end date</title>
      <link>https://communities.sas.com/t5/SAS-Programming/create-cycle-windows-from-start-and-end-date/m-p/439060#M109514</link>
      <description>&lt;P&gt;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/12887"&gt;@ErikLund_Jensen&lt;/a&gt;, the accepted solution was based on the latest&amp;nbsp;post by OP, which differed from the original in that respect. To get the day before the last cycle day, change&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;max(date)&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;to&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;max(min(date), intnx("DAY", max(date), -1))&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Wed, 21 Feb 2018 20:34:27 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/create-cycle-windows-from-start-and-end-date/m-p/439060#M109514</guid>
      <dc:creator>PGStats</dc:creator>
      <dc:date>2018-02-21T20:34:27Z</dc:date>
    </item>
  </channel>
</rss>

