【问题标题】:How to replace date column with NAs with an if condition如何使用带有 if 条件的 NA 替换日期列
【发布时间】:2020-12-30 09:06:36
【问题描述】:

我正在努力寻找一种更简单/更简单的方法来在特定条件下用 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

【问题讨论】:

    标签: r date dplyr tidyverse lubridate


    【解决方案1】:

    如果你想知道的话,@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  
    

    【讨论】:

      【解决方案2】:

      您可以像这样使用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,它工作得很好。我尝试过类似的东西,但它没有用,但我也不知道“NA_Date_”的存在。我刚刚在一个包含 150 万个观测值的数据库中运行,它运行得非常快。
      • 不客气。总是乐于提供帮助。顺便说一句:也不知道“NA_Date_”。但我知道“NA_character”和“NA_integer_”......所以我试了一下。 (; 最佳 S.
      猜你喜欢
      • 2023-03-28
      • 1970-01-01
      • 1970-01-01
      • 2019-09-08
      • 1970-01-01
      • 2016-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多