O problema aqui é que cada data está com um formato diferente de separadores, então nenhuma função do lubridate vai ser capaz de convertê-las de forma correta. Minha solução é ajustar os separadores e depois passar para ymd().
# Dados de exemplo
x <- c("2014-07-15", "2018/03/20", "2019-12-31", "20170511")
# Remover tudo que não for número
(x <- stringr::str_remove_all(x, "[^0-9]"))
#> [1] "20140715" "20180320" "20191231" "20170511"
# Converter para data
lubridate::ymd(x)
#> [1] "2014-07-15" "2018-03-20" "2019-12-31" "2017-05-11"
Executei o código abaixo e funcionou pra retirar a formato de separadores.
# Remover tudo que não for número
(x <- stringr::str_remove_all(x, "[^0-9]"))
#> [1] "20140715" "20180320" "20191231" "20170511"
Ao executar a lubridate::ymd(x) as datas retornam no formato desejado.
Uma coisa que futricando aqui é que tenho o formato “1/3/2018” também ( ). Ou seja, a sua sugestão funciona para a minha pergunta, mas como não me atentei ao “1/3/2018” os NA que restaram são dessa formatação.
Nesse caso vc precisa, infelizmente, uniformizar os formatos das datas Aqui eu tento resolver o problema das datas em português com dmy() antes de seguir para o ymd().
# Dados de exemplo
x <- c("2014-07-15", "2018/03/20", "2019-12-31", "20170511", "1/3/2018")
# Arrumar datas em PT
x[stringr::str_ends(x, "/[0-9]{4}")] <- x |>
stringr::str_subset("/[0-9]{4}$") |>
lubridate::dmy() |>
as.character()
# Remover tudo que não for número
(x <- stringr::str_remove_all(x, "[^0-9]"))
#> [1] "20140715" "20180320" "20191231" "20170511" "20180301"
# Converter para data
lubridate::ymd(x)
#> [1] "2014-07-15" "2018-03-20" "2019-12-31" "2017-05-11" "2018-03-01"