如何用特定日期替换缺少的日期并在R

时间:2018-12-22 17:29:17

标签: r date as.date

我有一个包含开始日期和结束日期的数据集。一些结束日期丢失了。如您在下面看到的,我尝试了三种不同的方法,但没有一种起作用。

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 个答案:

答案 0 :(得分:2)

这是另一个主意:

library(dplyr)
library(lubridate)

我们将使用lubridate::ymddplyr::case_when(有关更多信息,请参阅此lubridate cheat sheet)。

您的数据:

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