R recoger la fecha de inicio y la fecha de finalización del período de recesión

Estoy tratando de trazar los períodos de sombreado de recesión en R. Considere el siguiente ejemplo, los períodos de recesión se reconocen como 1 y los períodos de no recesión son 0.

Date Recession 1918-09-01 1 1918-10-01 1 1918-11-01 1 1918-12-01 1 1919-01-01 1 1919-02-01 1 1919-03-01 1 1919-04-01 0 1919-05-01 0 1919-06-01 0 1919-07-01 0 1919-08-01 0 1919-09-01 0 1919-10-01 0 1919-11-01 0 1919-12-01 0 1920-01-01 0 1920-02-01 1 1920-03-01 1 1920-04-01 1 1920-05-01 1 

¿Puede alguien ayudarme a recoger la fecha de inicio y las fechas de finalización de los períodos de recesión? Por ejemplo:

 Start End 1918-09-01 1919-03-01 1920-02-01 1920-05-01 

La misma pregunta se hizo hace unos años, pero creo que la respuesta no puede resolver esta pregunta. ver R Conversión de fechas de recesión

¡Gracias por adelantado!

Usando la función rleid() del paquete data.table :

 library(data.table) data.table(DF)[, .(min(Date), max(Date)), by = .(rleid(Recession), Recession)][ Recession == 1, .(Start = V1, End = V2)] 
  Start End 1: 1918-09-01 1919-03-01 2: 1920-02-01 1920-05-01 

Explicación

La primera expresión data.table encuentra las fechas de inicio y finalización de todos los períodos. rleid() es una función de conveniencia para generar una columna de ID de tipo de longitud de ejecución que se utilizará en las operaciones de agrupación .

 data.table(DF)[, .(min(Date), max(Date)), by = .(rleid(Recession), Recession)] 
  rleid Recession V1 V2 1: 1 1 1918-09-01 1919-03-01 2: 2 0 1919-04-01 1920-01-01 3: 3 1 1920-02-01 1920-05-01 

La segunda expresión selecciona solo los períodos de recesión y devuelve las fechas de Start y End .

Datos

 DF <- readr::read_table( "Date Recession 1918-09-01 1 1918-10-01 1 1918-11-01 1 1918-12-01 1 1919-01-01 1 1919-02-01 1 1919-03-01 1 1919-04-01 0 1919-05-01 0 1919-06-01 0 1919-07-01 0 1919-08-01 0 1919-09-01 0 1919-10-01 0 1919-11-01 0 1919-12-01 0 1920-01-01 0 1920-02-01 1 1920-03-01 1 1920-04-01 1 1920-05-01 1 " )