Using the rleid()
function from the data.table
package:
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
Explanation
The first data.table
expression finds start and end dates of all periods. rleid()
is a convenience function for generating a run-length type id column to be used in grouping operations.
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
The second expression picks only the Recession periods and returns the Start
and End
dates.
Data
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 "
)