Итеративный подход, аналогичный тому, как пакеты вроде lubridate
и другие пытаются найти совпадение. Здесь используется несколько, включая модель Excel (которая, я думаю, использует происхождение «1900-01-01», кстати). Порядок немного важен: перед лицом двусмысленности лучший эвристический c найдет тот, у которого больше всего совпадений, и использует его для всех ... но это уже ваше дело.
dat <- read.table(header=FALSE, stringsAsFactors=FALSE, text="
person_1 39257
person_2 2015/2/20
person_3 NA")
conv_dates <- function(dates, origin = "1900-01-01") {
out <- Sys.Date()[rep(NA, length(dates))]
notna0 <- !is.na(dates)
allnum <- notna0 & grepl("^[.0-9]+$", dates)
if (any(allnum)) out[allnum] <- suppressWarnings(as.Date(as.numeric(dates[allnum]), origin = origin))
fmts <- c("%Y/%m/%d", "%d/%m/%Y", "%m/%d/%Y")
for (fmt in fmts) {
isna <- notna0 & is.na(out)
if (!any(isna)) break
out[isna] <- as.Date(dates[isna], format = fmt)
}
out
}
str(conv_dates(dat$V2))
# Date[1:3], format: "2007-06-26" "2015-02-20" NA