Converter dd / mm / aa e dd / mm / aaaa para Datas

Eu tenho um vetor de personagens com datas em vários formatos como este

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

Eu quero convertê-los em datas. Eu tentei o dmy muito bom do pacote lubricidate, mas isso não funciona:

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

Está tratando o ano / 12 como se fosse 0012.

Então, agora estou tentando expressão regular para selecionar cada tipo e converter individualmente em datas usando as.Date (). No entanto, a expressão regular que tentei selecionar apenas dd / mm / aa não funciona.

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

devolve

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

Eu pensei que o {2,2} deveria pegar exatamente 2 números e não todos eles. Eu não sou muito bom em expressões regulares, então qualquer ajuda será apreciada.

obrigado

EDITAR

O que eu realmente tenho são três tipos diferentes de data como abaixo

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

E quero convertê-los em datas

parse_date_time(dates,c('dmy'))

me dá

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

No entanto, isso está errado e 0012 deve ser 2012. Eu gostaria de uma solução (bastante simples) para isso.

Uma solução que tenho agora (graças a @plannapus) é usar expressões regulares. Eu acabei criando essa função, pois ainda estava recebendo alguns casos em que a abordagem do lubridato estava se tornando 12 em 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}

Mas isso não é muito elegante. Alguma melhor solução?

, #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"

Mas isso não é muito elegante. Alguma melhor solução?

questionAnswers(6)

yourAnswerToTheQuestion