0

我在数据框中有一个源列,其中日期可能是“dd.mm.yyyy”格式或 5 位数字的 Excel 格式。因此,我想检查ifelse元素的外观str_detect,然后为每个元素使用适当的转换。

df$date <- ifelse(str_detect(df$date, "[0-9]{2}.[0-9]{2}.[0-9]{4}") == TRUE, 
                      as.Date(df$date, format = "%d.%m.%Y"),
                      as.Date(as.numeric(df$date), origin = "1899-12-30"))

虽然这两个转换函数都按预期工作,但当我将它们放入ifelse语句时,我得到了奇怪的结果——基本上 2019 年 1 月 1 日变成了“17897”。有人可以解释为什么会发生这种情况以及我如何让它发挥作用吗?谢谢

编辑:代码片段

  df <- c("01.01.2019", "43867")
  df <- ifelse(str_detect(df, "[0-9]{2}.[0-9]{2}.[0-9]{4}") == TRUE,
                      as.Date(df, format = "%d.%m.%Y"),
                      as.Date(as.numeric(df), origin = "1899-12-30"))

期望的输出:"2019-01-01" "2020-02-06" 结果输出 17897 18298 如果我在没有 的情况下应用第一个(是)函数ifelse,我将得到"2019-01-01" NA,并且没有函数导致NA "2020-02-06"

4

2 回答 2

0

您可以将数据转换为数字,将不是数字的日期更改为NA(带有可以安全忽略的警告),然后我们可以if_else根据它将它们更改为日期。

df <- c("01.01.2019", "43867")
df1 <- as.numeric(df)
dplyr::if_else(is.na(df1), as.Date(df, format = "%d.%m.%Y"),
                as.Date(df1, origin = "1899-12-30"))
#[1] "2019-01-01" "2020-02-06"
于 2020-02-13T09:55:44.887 回答
0

只需更改类,如 ifelse 的帮助页面中所述。无需加载其他包。

> class(df) <- "Date"
> df
[1] "2019-01-01" "2020-02-06"
于 2020-02-13T10:03:37.770 回答