Datas::lubridate

Suponha uma base que se encontra com a seguinte variável:

x <- c("2014-07-15", "2018/03/20", "2019-12-31", "20170511")

Essa variável é da classe character e ao utilizar as.Date tenho o seguinte resultado que não é o desejado:

> as.Date(x)
[1] "2014-07-15" NA           "2019-12-31" NA  

E mesmo utilizando o lubridate::as_date(x) obtenho NA quando tenho “2018/03/20” na minha base de dados real.

Tentei alterar o formato dela utilizando format(ymd(x), “%Y/%m$d”) e permaneço no erro.

Como resolver este problema?

Ótima pergunta, Fernanda.

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"

Created on 2021-12-06 by the reprex package (v2.0.1)

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 ( :sob:). 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 :confused: 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"

Created on 2021-12-08 by the reprex package (v2.0.1)

1 Curtida

Muito obrigada Caio! Quando eu crescer quero ser igual você. :sweat_smile:

1 Curtida