Вот немного надуманный метод для вывода года, основанный на сопоставлении предоставленного дня недели.
library(dplyr)
library(tidyr)
df <- tibble(Dates = c("Sun 22nd Jul", "Sat 20th Jul"))
guesses <- df %>%
mutate(
rn = row_number(),
DOW = gsub(" .*", "", Dates),
Date1 = gsub("(?<=[0-9])(st|nd|rd|th)\\b", "", Dates, perl = TRUE),
Date1 = gsub("^\\D*(?=[0-9])", "", Date1, perl = TRUE)
) %>%
crossing(
Year = 2000:2020
) %>%
mutate(
Date2 = as.Date(paste(Date1, Year), format = "%d %b %Y"),
DOW2 = format(Date2, format = "%a")
) %>%
filter(DOW == DOW2)
guesses
# # A tibble: 7 x 7
# Dates rn DOW Date1 Year Date2 DOW2
# <chr> <int> <chr> <chr> <int> <date> <chr>
# 1 Sat 20th Jul 2 Sat 20 Jul 2002 2002-07-20 Sat
# 2 Sat 20th Jul 2 Sat 20 Jul 2013 2013-07-20 Sat
# 3 Sat 20th Jul 2 Sat 20 Jul 2019 2019-07-20 Sat
# 4 Sun 22nd Jul 1 Sun 22 Jul 2001 2001-07-22 Sun
# 5 Sun 22nd Jul 1 Sun 22 Jul 2007 2007-07-22 Sun
# 6 Sun 22nd Jul 1 Sun 22 Jul 2012 2012-07-22 Sun
# 7 Sun 22nd Jul 1 Sun 22 Jul 2018 2018-07-22 Sun
(Выбор 2000 в качестве отправной точки был произвольным Должно быть проинформировано о ваших знаниях об источнике данных.)
Если мы предположим, что необходим самый последний, то
guesses %>%
arrange(desc(Date2)) %>%
group_by(rn) %>%
slice(1) %>%
ungroup()
# # A tibble: 2 x 7
# Dates rn DOW Date1 Year Date2 DOW2
# <chr> <int> <chr> <chr> <int> <date> <chr>
# 1 Sun 22nd Jul 1 Sun 22 Jul 2018 2018-07-22 Sun
# 2 Sat 20th Jul 2 Sat 20 Jul 2019 2019-07-20 Sat
Если предположим, что они все в одном и том же году имеет решающее значение, тогда
guesses %>%
group_by(Year) %>%
filter(all(df$Dates %in% Dates)) %>%
ungroup()
(К сожалению, для этих данных он ничего не показывает, что крайне маловероятно.)
Конечно, существуют и другие методы вывода Можно попытаться угадать скрытые годы.
Отсюда все, что вам нужно, это столбец Date2
.