我有一个 tibble
,其中有几列包含日期,其中一些是将来的日期(例如 2019-08-26)。我需要用 NA
替换 future 的日期,并希望使用 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
最佳答案
来自帮助(替换)
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_else
和 ifelse
以及日期不能很好地结合在一起。
# don't run
# d %>% mutate(Date2 = ifelse(Date1 < today(), Date1, NA))
更新
如果您有多个列,则选项是 mutate_if
d %>%
mutate_if(., is.Date, .funs = ~replace(., . > today(), NA))
关于使用 dplyr 将 future 日期替换为 NA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57562847/