Как конвертировать даты в R из нескольких форматов одновременно? - PullRequest
0 голосов
/ 13 февраля 2020

У меня есть исходный столбец в кадре данных, где даты могут быть в формате "dd.mm.yyyy" или в формате Excel с 5-значным числом git. Следовательно, я хотел бы проверить с помощью ifelse, как выглядит элемент с str_detect, а затем использовать соответствующее преобразование для каждого.

df$date <- ifelse(str_detect(df$date, "[0-9]{2}.[0-9]{2}.[0-9]{4}") == TRUE, 
                      as.Date(df$date, format = "%d.%m.%Y"),
                      as.Date(as.numeric(df$date), origin = "1899-12-30"))

Хотя обе функции преобразования работают как задумано, когда я помещаю их в оператор ifelse, я получаю странные результаты - в основном 1 января 2019 года становится "17897". Может кто-нибудь объяснить, почему это происходит и как я могу заставить это работать? Спасибо

Редактировать: фрагмент кода

  df <- c("01.01.2019", "43867")
  df <- ifelse(str_detect(df, "[0-9]{2}.[0-9]{2}.[0-9]{4}") == TRUE,
                      as.Date(df, format = "%d.%m.%Y"),
                      as.Date(as.numeric(df), origin = "1899-12-30"))

Желаемый вывод: "2019-01-01" "2020-02-06" Результирующий вывод 17897 18298 Где, если я применю первую (да) функцию без ifelse, я получу "2019-01-01" NA, и никакая функция не приводит к NA "2020-02-06"

Ответы [ 2 ]

0 голосов
/ 13 февраля 2020

Просто измените класс, как указано на странице справки ifelse. Нет необходимости загружать другие пакеты.

> class(df) <- "Date"
> df
[1] "2019-01-01" "2020-02-06"
0 голосов
/ 13 февраля 2020

Вы можете преобразовать данные в цифры c, даты, которые не являются числами, будут изменены на NA (с предупреждением, которое можно игнорировать), затем мы можем использовать if_else, чтобы изменить их на дату. в теме.

df <- c("01.01.2019", "43867")
df1 <- as.numeric(df)
dplyr::if_else(is.na(df1), as.Date(df, format = "%d.%m.%Y"),
                as.Date(df1, origin = "1899-12-30"))
#[1] "2019-01-01" "2020-02-06"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...