使用 dplyr 将未来日期替换为 NA

Replace future dates with NA using dplyr

我有一个 tibble,其中有几列包含日期,其中一些是未来的日期(例如 2019-08-26)。我需要用 NA 替换未来的日期,并希望使用 dplyr.

到目前为止,我有以下内容,但不起作用:

library(lubridate)
library(dplyr)
library(tibble)
d <- tibble("ID" = 1:9,
            "Date1" = as_date(c("2019-08-05", "2019-08-26", "2019-08-26",
                                "2019-08-26", "2019-07-29", "2019-08-12", 
                                "2019-08-19", "2019-08-26", "2019-08-26")),
            "Date2" = as_date(c("2019-08-12", "2019-09-02", "2019-09-02",
                                 "2019-09-02", "2019-08-05", "2019-08-19",
                                 "2019-08-26", "2019-09-02", "2019-09-02")))

d %>%
  select("Date1") %>%
  replace(. > today(), NA) #This line doesn't work

来自help(replace)

Arguments

x: vector

所以改用pull

library(dplyr)
d %>%
  pull("Date1") %>%
  replace(. > today(), NA)
#[1] "2019-08-05" NA           NA           NA           "2019-07-29"
#[6] "2019-08-12" "2019-08-19" NA           NA      

如果您需要 tibble 并尝试替换这些值,请使用 mutate

d %>%
 mutate(Date2 = replace(Date1, Date1 > Sys.Date(), NA))
# A tibble: 9 x 3
#     ID Date1      Date2     
#  <int> <date>     <date>    
#1     1 2019-08-05 2019-08-05
#2     2 2019-08-26 NA        
#3     3 2019-08-26 NA        
#4     4 2019-08-26 NA        
#5     5 2019-07-29 2019-07-29
#6     6 2019-08-12 2019-08-12
#7     7 2019-08-19 2019-08-19
#8     8 2019-08-26 NA        
#9     9 2019-08-26 NA           

正如@d.b指出的那样。在评论中,也在 How to prevent ifelse() from turning Date objects into numeric objects if_elseifelse 中,日期并没有很好地结合在一起。

# don't run
# d %>% mutate(Date2 = ifelse(Date1 < today(), Date1, NA))

更新

如果您有多个列,一个选项是 mutate_if

d %>%
  mutate_if(., is.Date, .funs = ~replace(., . > today(), NA))