【问题标题】:Replace NA value in column with modified date in other column [duplicate]用其他列中的修改日期替换列中的 NA 值[重复]
【发布时间】:2021-04-27 10:55:50
【问题描述】:

我有以下数据集:

  A          B
2007-11-22 2004-11-18
      <NA> 2004-11-10

当 A 列的值为 NA 时,我希望将此值替换为 B 中的日期,除非增加了 25 天。 结果应该是这样的:

   A          B
2007-11-22 2004-11-18
2004-12-05 2004-11-10

到目前为止,我已经尝试了以下 if else 公式,但没有成功。

library(lubridate)
data$A<- ifelse(is.na(data$A),data$B+days(25),data$A)

谁能告诉我它有什么问题或给我一个替代解决方案?构建我的数据集的代码如下。

A<-c("2007-11-22 01:00:00", NA)
B<-c("2004-11-18","2004-11-10")
data<-data.frame(A,B)
data$A<-as.Date(data$A);data$B<-as.Date(data$B)

【问题讨论】:

    标签: r date if-statement replace na


    【解决方案1】:

    问题的原因可以追溯到ifelse的源代码。当您输入View(ifelse) 时,您会在源代码底部看到如下几行

        ans <- test
        len <- length(ans)
        ypos <- which(test)
        npos <- which(!test)
        if (length(ypos) > 0L)
            ans[ypos] <- rep(yes, length.out = len)[ypos]
        if (length(npos) > 0L)
            ans[npos] <- rep(no, length.out = len)[npos]
        ans
    

    其中test 是逻辑数组,ans 被初始化为test 的副本。当运行ans[ypos] &lt;- rep(yes, length.out = len)[ypos] 时,ans 的类被强制为numeric,而不是Date。这就是为什么在使用ifelse 之后,A 列上有整数。


    你可以试试下面的代码

    data$A <- as.Date(ifelse(is.na(data$A), data$B + days(25), data$A), origin = "1970-01-01")
    

    给了

    > data
               A          B
    1 2007-11-22 2004-11-18
    2 2004-12-05 2004-11-10
    

    【讨论】:

      【解决方案2】:

      假设在最后的注释中给出了可重复的数据——特别是我们假设两列都属于Date 类——计算一个逻辑向量is_na,它指示哪些条目是 NA,然后从 B 中设置这些条目。

      is_na <- is.na(data$A)
      data$A[is_na] <- data$B[is_na] + 25
      

      这也可以工作,并具有不会覆盖data的优点:

      transform(data, A = replace(A, is.na(A), B[is.na(A)] + 25))
      

      注意

      Lines <- "
               A          B
      2007-11-22 2004-11-18
              NA 2004-11-10"
      data <- read.table(text = Lines, header = TRUE)
      data[] <- lapply(data, as.Date)  # convert to Date class
      

      【讨论】:

        【解决方案3】:

        你可以使用coalesce代替ifelse

        library(tidyverse)
        library(lubridate)
        
        A <- c("2007-11-22 01:00:00", NA)
        B <- c("2004-11-18","2004-11-10")
        data <-data.frame(A,B)
        
        data <- data %>%
          mutate(A = as_date(A),
                 B = as_date(B),
                 A = coalesce(A,B+days(25)))
        

        【讨论】:

          猜你喜欢
          • 2018-02-18
          • 1970-01-01
          • 1970-01-01
          • 2019-06-27
          • 2023-03-28
          • 2023-04-09
          • 2018-04-11
          • 2023-01-26
          • 1970-01-01
          相关资源
          最近更新 更多