如何在 if 条件下用 NA 替换日期列
How to replace date column with NAs with an if condition
我正在努力寻找一种 easier/simpler 在特定条件下用 NA 替换数据集 (tibble) 中的日期列的方法。
这是实际尝试完成任务的代码。我想要的是用缺失值替换早于 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
您可以像这样使用 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
与@stefan 相同的答案,如果你想知道 case_when
语法
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
我正在努力寻找一种 easier/simpler 在特定条件下用 NA 替换数据集 (tibble) 中的日期列的方法。
这是实际尝试完成任务的代码。我想要的是用缺失值替换早于 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
您可以像这样使用 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
与@stefan 相同的答案,如果你想知道 case_when
语法
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