【发布时间】:2017-10-26 16:19:16
【问题描述】:
我有一个包含数万个条目的日期变量的数据框。我认为某处可能存在数据输入错误,因为我无法将其转换为日期类变量或在 lubridate() 中对其进行处理。
在这个 MWE 中,第一个观察结果 (a1) 是一个合法的日期,我希望我的日期是这样的格式。其他观察结果 (a2-a7) 代表不同类型的数据输入错误。我想测试 date 变量中的每个观察结果,以查看观察结果是否是预期格式的合法日期。
我尝试使用常规模式和 ifelse(),但无法让代码正常工作。我想最终得到类似 df2 的东西(尽管它不一定是数据框),这样我就可以轻松识别可能需要注意的任何日期变量观察的 ID。任何帮助将非常感激。
起点:
df1 <- data.frame(varID=c("a1","a2","a3","a4","a5","a6","a7"),varDate=c("01/01/2015","0101/2016","01/012017","35/01/2018","01/17/2019","01/01/20200","abc"))
期望的结果:
df2 <- data.frame(varID=c("a2","a3","a4","a5","a6","a7"),VarIssue=c("format issue","format issue","format issue","format issue","format issue","format issue"))
当前代码:
ifelse(df1$varDate == (^(0[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[012])[- /.](19|20)\d\d$),"ok","format issue")
【问题讨论】:
-
我可能遗漏了一些东西,但为什么不使用
as.Date使用“ok”format,并找到NA(“格式问题”):is.na(as.Date(df1$varDate, format = "%d/%m/%Y")) -
虽然我可以把它变成一个因素或字符,但它不会让我把它变成一个日期类变量。
-
@Henrik 我喜欢这个逻辑,但提供的正则表达式将接受多种日期格式,使用
/、-或.作为分隔符。 -
@Henrik 不应该像
as.Date('01-01-20000000', '%d-%m-%Y')这样的东西不能像as.Date('2000000-01-01', '%Y-%d-%m')那样解析吗? -
@rawr 否,“每个输入字符串都按照指定格式进行处理:忽略任何尾随字符。”(
?strptime)。
标签: r