【问题标题】:mutating a new variable with ifelse() loses date format [duplicate]使用 ifelse() 改变新变量会丢失日期格式 [重复]
【发布时间】:2018-03-24 04:59:41
【问题描述】:

这是一个小的df:

x <- structure(list(DOB = structure(c(-1689, 2884, 11348, 10449, -1280, 
3128), class = "Date"), SU_BIRTH_DATE = structure(c(47482, 2884, 
11347, 10449, -1280, 2324), class = "Date")), .Names = c("DOB", 
"SU_BIRTH_DATE"), row.names = c(NA, 6L), class = "data.frame")

看起来像:

glimpse(x)
Observations: 6
Variables: 2
$ DOB           <date> 1965-05-18, 1977-11-24, 2001-01-26, 1998-08-11, 1966-07-01, 1978-07-26
$ SU_BIRTH_DATE <date> 2100-01-01, 1977-11-24, 2001-01-25, 1998-08-11, 1966-07-01, 1976-05-13

我想像这样使用ifelse() 创建一个新功能:

test <- x %>% 
  mutate(NewDOB = ifelse(is.na(DOB), SU_BIRTH_DATE, DOB))

但是:

glimpse(test)
Observations: 6
Variables: 3
$ DOB           <date> 1965-05-18, 1977-11-24, 2001-01-26, 1998-08-11, 1966-07-01, 1978-07-26
$ SU_BIRTH_DATE <date> 2100-01-01, 1977-11-24, 2001-01-25, 1998-08-11, 1966-07-01, 1976-05-13
$ NewDOB        <dbl> -1689, 2884, 11348, 10449, -1280, 3128

新变量不是日期而是双精度。我尝试使用 lubridate ymd() 重新格式化它:

test <- x %>% 
  mutate(NewDOB = ifelse(is.na(DOB), SU_BIRTH_DATE, DOB)) %>% 
  mutate(NewDOB = ymd(NewDOB))

但是:

glimpse(test)
Observations: 6
Variables: 3
$ DOB           <date> 1965-05-18, 1977-11-24, 2001-01-26, 1998-08-11, 1966-07-01, 1978-07-26
$ SU_BIRTH_DATE <date> 2100-01-01, 1977-11-24, 2001-01-25, 1998-08-11, 1966-07-01, 1976-05-13
$ NewDOB        <date> NA, NA, NA, NA, NA, NA

我也尝试了 as.Date() 而不是 ymd ,它给出了一个错误:

mutate_impl(.data, dots) 中的错误: 评估错误:必须提供“原点”。

如何在不丢失日期格式的情况下,根据原来的两个日期特征创建新的日期日期?或者至少能够将其转换回来?在这种情况下,由于不是所有的 DOB 案例都是 NA,我希望新功能 NewDob 具有与 DOB 完全相同的数据。

【问题讨论】:

    标签: r


    【解决方案1】:
    as.Date(test$NewDOB, origin="1970-1-1")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多