Как заменить отсутствующие даты конкретной датой и сохранить формат в качестве даты в R

У меня есть набор данных, который имеет дату начала и дату окончания. Некоторые даты окончания отсутствуют. Как вы можете видеть ниже, я пробовал три разных подхода, и ни один из них не работает.

startDay <- as.Date(c("2015-01-01","2015-03-01","2016-07-15","2016-08-02"), "%Y-%m-%d")
endDay <- as.Date(c("2018-01-01",NA,"2018-03-05",NA), "%Y-%m-%d")
id <- 1:4
dt <- data.frame(id, startDay, endDay)
dt
str(dt)

dt$caseDay <- as.Date("2018-07-20", "%Y-%m-%d")  
str(dt)
dt

Это меняет класс моей переменной с даты на число:

dt$EndDay1 <-
ifelse(is.na(dt$endDay), dt$caseDay, dt$endDay)
str(dt)
dt

Этот генерирует сообщение об ошибке.

dt$EndDay2 <-as.Date(
ifelse(is.na(dt$endDay), dt$caseDay, dt$endDay), "%Y-%m-%d")
str(dt)
dt

Если мое исследование / понимание связанных постов правильное, версия 3 ниже должна решить проблему. Однако это преобразовало все в пропущенные значения.

dt$EndDay3 <-as.Date(as.character(
ifelse(is.na(dt$endDay), dt$caseDay, dt$endDay)), "%Y-%m-%d")
str(dt)
dt

Любое предложение о том, как решить эту проблему? Спасибо

1 ответ

Вот еще одна идея:

library(dplyr)
library(lubridate)

Мы будем использовать lubridate::ymd а также dplyr::case_when (см. этот шпаргалку для большего количества положительных героев).

Ваши данные:

dt <- tibble(
  startDay = ymd(c("2015-01-01", "2015-03-01", "2016-07-15", "2016-08-02")),
  endDay = ymd(c("2018-01-01", NA, "2018-03-05", NA))
)

caseDay:

caseDay <- ymd("2018-07-20")

использование case_when:

dt <- dt %>%
  mutate(endDay = case_when(is.na(endDay) ~ caseDay,
                            TRUE ~ endDay))

(Примечание: дело TRUE это как "по умолчанию", если ни один из случаев не помечен)

Результат:

> dt
# A tibble: 4 x 2
  startDay   endDay    
  <date>     <date>    
1 2015-01-01 2018-01-01
2 2015-03-01 2018-07-20
3 2016-07-15 2018-03-05
4 2016-08-02 2018-07-20
Другие вопросы по тегам