Почему dmy () в пакете lubridate не работает с NA? Каков хороший обходной путь?

Я наткнулся на странное поведение в пакете lubridate : dmy (NA) trows an ошибка вместо того, чтобы просто вернуть NA. Это вызывает у меня проблемы, когда я хочу преобразовать столбец с некоторыми элементами, являющимися NAs, и некоторыми строками даты, которые обычно конвертируются без проблем.

Вот минимальный пример:

library(lubridate)
df <- data.frame(ID=letters[1:5],
              Datum=c("01.01.1990", NA, "11.01.1990", NA, "01.02.1990"))
df_copy <- df
#Question 1: Why does dmy(NA) not return NA, but throws an error?
df$Datum <- dmy(df$Datum)
Error in function (..., sep = " ", collapse = NULL)  : invalid separator
df <- df_copy
#Question 2: What's a work around?
#1. Idea: Only convert those elements that are not NAs
#RHS works, but assigning that to the LHS doesn't work (Most likely problem::
#column "Datum" is still of class factor, while the RHS is of class POSIXct)
df[!is.na(df$Datum), "Datum"] <- dmy(df[!is.na(df$Datum), "Datum"])
Using date format %d.%m.%Y.
Warning message:
In `[<-.factor`(`*tmp*`, iseq, value = c(NA_integer_, NA_integer_,  :
invalid factor level, NAs generated
df #Only NAs, apparently problem with class of column "Datum"
ID Datum
1  a  <NA>
2  b  <NA>
3  c  <NA>
4  d  <NA>
5  e  <NA>
df <- df_copy
#2. Idea: Use mapply and apply dmy only to those elements that are not NA
df[, "Datum"] <- mapply(function(x) {if (is.na(x)) {
                                 return(NA)
                               } else {
                                 return(dmy(x))
                               }}, df$Datum)
df #Meaningless numbers returned instead of date-objects
ID     Datum
1  a 631152000
2  b        NA
3  c 632016000
4  d        NA
5  e 633830400

Подводя итог, у меня есть два вопроса: 1) Почему dmy (NA) не работает? Основываясь на большинстве других функций, я полагаю, что это хорошая практика программирования, когда каждое преобразование (например, dmy ()) из NA снова возвращает NA (так же, как 2 + NA делает)? Если такое поведение предусмотрено, как мне преобразовать столбец data.frame , который включает NA , через функцию dmy () ?

11
задан Andrie 31 October 2011 в 16:26
поделиться