Convertir dd / mm / aa y dd / mm / aaaa a fechas

Tengo un vector de caracteres con fechas en varios formatos como este.

dates <- c("23/11/12", "20/10/2012", "22/10/2012" ,"23/11/12")

Quiero convertir estos a fechas. He probado el muy buen dmy del paquete lubridate, pero esto no funciona:

    dmy(dates)
[1] "0012-11-23 UTC" "2012-10-20 UTC" "2012-10-22 UTC" "0012-11-23 UTC"

Se trata el / 12 año como si fuera 0012.

Así que ahora estoy intentando la expresión regular para seleccionar cada tipo y convertir individualmente a fechas usando as.Date (). Sin embargo, la expresión regular que he intentado seleccionar dd / mm / aa solo no funciona.

dates[grep('[0-9]{2}/[0-9]{2}/[0-9]{2,2}', dates)]

devoluciones

[1] "23/11/12"   "20/10/2012" "22/10/2012" "23/11/12"

Pensé que el {2,2} debería obtener exactamente 2 números y no todos. No soy muy bueno en la expresión regular por lo que cualquier ayuda será apreciada.

Gracias

EDITAR

Lo que realmente tengo son tres tipos diferentes de fecha como se muestra a continuación

dates <- c("23-Jul-2013", "23/11/12", "20/10/2012", "22/10/2012" ,"23/11/12")

Y quiero convertirlos a fechas.

parse_date_time(dates,c('dmy'))

me da

[1] "2013-07-23" "0012-11-23" "2012-10-20" "2012-10-22" "0012-11-23"

Sin embargo, esto es incorrecto y 0012 debería ser 2012. Me gustaría una solución (bastante simple) para esto.

Una solución que tengo ahora (gracias a @plannapus) es usar expresiones regulares. De hecho, terminé creando esta función, ya que aún estaba recibiendo algunos casos en los que el enfoque de lubricación estaba convirtiendo 12 en 0012.

    asDateRegex <- function(dates, 
        #selects strings from the vector dates using regexes and converts these to Dates
        regexes = c('[0-9]{2}/[0-9]{2}/[0-9]{4}', #dd/mm/yyyy
            '[0-9]{2}/[0-9]{2}/[0-9]{2}

Pero esto no es muy elegante. ¿Alguna solución mejor?

, #dd/mm/yy '[0-9]{2}-[[:alpha:]]{3}-[0-9]{4}'), #dd-mon-yyyy orders = 'dmy', ...){ require(lubridate) new_dates <- as.Date(rep(NA, length(dates))) for(reg in regexes){ new_dates[grep(reg, dates)] <- as.Date(parse_date_time(dates[grep(reg, dates)], order = orders)) } new_dates } asDateRegex (dates) [1] "2012-10-20" "2013-07-23" "2012-11-23" "2012-10-22" "2012-11-23"

Pero esto no es muy elegante. ¿Alguna solución mejor?

Respuestas a la pregunta(6)

Su respuesta a la pregunta