Помогает ли вам эта грубая функция?Это должно работать даже для таких строк, как "3 years, 2 months ago"
.Возвращает NA
, если month
, year
или day
не отображаются в строке с цифрой впереди.
library("stringr")
# Small helper function to convert NAs to zero and convert to numeric
na_to_zero <- function(x) {
x[is.na(x)] <- "0"
return(as.numeric(x))
}
get_date_before_today <- function(d) {
today <- Sys.Date()
days <- na_to_zero(str_extract(d, "(?i)[0-9]*(?= day\\D)"))
months <- na_to_zero(str_extract(d, "(?i)[0-9]*(?= month\\D)"))
years <- na_to_zero(str_extract(d, "(?i)[0-9]*(?= year\\D)"))
days_ago <- days + 365.25/12*months + 365.25*years
date_before_today <- today - days_ago
# If no matches were made, zeros are substituted for all, and hence days_ago is 0
date_before_today[days_ago == 0] <- NA
return(date_before_today)
}
Проверка:
d <- c("4 months ago asds", "2 years ago", "1 day ago", "5 years, 3 months", "never")
get_date_before_today(d)
#[1] "2018-05-15" "2016-09-13" "2018-09-13" "2013-06-14" NA
Примечание,это не дает вам точных дат как таковых.Но, думаю, можно утверждать, что, например, 1 месяц назад может быть неоднозначным.Что конкретно означает месяц назад, если сегодня 31 октября?
Случай "недели" можно добавить тривиально.