【发布时间】:2020-05-28 23:02:55
【问题描述】:
我在数据框中有一个源列,其中日期可能是“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”。有人可以解释为什么会发生这种情况以及我如何使它起作用吗?谢谢
编辑:代码 sn-p
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"
【问题讨论】:
-
有趣的问题,最好有一个 reproducible example 和数据的 sn-p 来测试解决方案。
-
你能给出例子和预期的输出
-
阅读
ifelse的帮助页面,特别是警告。 -
我们需要一个例子,但是如果变量存储为日期对象,我不明白为什么你不能将它们强制转换为数字,然后你可以使用时间戳。如果您使用 dput(),您可以更准确地向我们展示问题所在
-
添加代码sn-p