如何使用if条件将NA替换为日期列

问题描述

我正在努力寻找在特定条件下用NA替换数据集(小标题)中的日期列的更简便方法

这是实际尝试执行任务的代码。我想要的是用缺少的值替换比2020年6月更新且早于1900年1月的日期,而不更改已经存在的缺失值。但是这段代码非常丑陋。有没有更简单的方法,特别是使用tidyverse工具?

library(lubridate)
library(dplyr)

x <- seq(1,5)
y <- c(dmy("04/02/1863","29/10/1989","16/03/2000","14/05/2021",NA))
dat <- tibble(x,y)

dat$y[which(dat$y >= dmy("01/06/2020") | dat$y < dmy("01/01/1900"))] <- 
  rep(NA,length(dat$y[which(dat$y >= dmy("01/06/2020") | dat$y < dmy("01/01/1900"))]))

dat

解决方法

如果您想知道,使用case_when语法的@stefan会得到相同的答案

library(dplyr)
library(lubridate)
dat %>% 
  mutate(y = case_when(y >= dmy("01/06/2020") | y < dmy("01/01/1900") ~ NA_Date_,TRUE ~ y))
#       x      y         
#     <int> <date>    
# 1     1 NA        
# 2     2 1989-10-29
# 3     3 2000-03-16
# 4     4 NA        
# 5     5 NA  
,

您可以像这样使用if_else

library(lubridate)
library(dplyr)

x <- seq(1,5)
y <- c(dmy("04/02/1863","29/10/1989","16/03/2000","14/05/2021",NA))
dat <- tibble(x,y)

dat %>% 
  mutate(y = if_else(y >= dmy("01/06/2020") | y < dmy("01/01/1900"),NA_Date_,y))
#> # A tibble: 5 x 2
#>       x y         
#>   <int> <date>    
#> 1     1 NA        
#> 2     2 1989-10-29
#> 3     3 2000-03-16
#> 4     4 NA        
#> 5     5 NA