Вот подход: сначала добавьте число month
к рабочим датам.Затем для любой из дат, которые вы хотите найти, сначала добавьте один месяц к дате (используя %m+% months(1)
от lubridate, чтобы избежать опрокидывания, и используйте месяц этой даты , чтобы выполнить объединение. Вотвоспроизводимый пример (только с использованием нескольких дат из вопроса).
library(tidyverse)
library(lubridate)
df_close_day <- data.frame(
month = c("January", "Feburary", "March", "April"),
first_biz_day = ymd(c("2019-01-02", "2019-02-01", "2019-03-01", "2019-04-01"))
)
# Add the month so that we can join this later
df_close_day <- df_close_day %>%
mutate(
month_of_first_biz_day = month(first_biz_day)
)
df_dates_to_lookup <- data.frame(
orig_date = ymd(c("2018-12-21", "2019-01-01", "2019-01-31", "2019-02-15"))
)
df_dates_to_lookup %>%
mutate(
next_month = orig_date %m+% months(1),
month_of_next = month(next_month)
) %>%
left_join(
df_close_day, by = c("month_of_next" = "month_of_first_biz_day")
)
#> orig_date next_month month_of_next month first_biz_day
#> 1 2018-12-21 2019-01-21 1 January 2019-01-02
#> 2 2019-01-01 2019-02-01 2 Feburary 2019-02-01
#> 3 2019-01-31 2019-02-28 2 Feburary 2019-02-01
#> 4 2019-02-15 2019-03-15 3 March 2019-03-01