1

我对 R 还很陌生,但是我在完成原本看起来很简单的任务时遇到了很大的挑战。

我在一个向量中有许多不一致的记录日期。我的目标是将它们全部转换为标记为 的新向量中的相同 R 接受的日期格式clean_end_date。到目前为止,我已经能够使用as.Date和的组合grep将几乎所有格式都%Y-%m-%d格式化为 R 中的一般格式:

d$clean_end_date[grep("[0-9]{2}/[0-9]{2}/[0-9]{4}", d$End_Date, value=F)] <- as.character(as.Date(grep("[0-9]{2}/[0-9]{2}/[0-9]{4}", d$End_Date, value=T, fixed = FALSE), format="%d/%m/%Y"))

但是,无论我如何操作代码,都有几个日期不会转换。产生 NA 的行使用破折号而不是斜杠作为分隔符。不同的日期格式具有相同数量的字符,因此计算它们无助于区分它们。我可以手动识别这些行,也可以使用正则表达式字符串匹配函数来识别格式。我以为grep()在这里会有所帮助,但事实并非如此。

我用来格式化大部分内容的代码在这里:

d$clean_end_date <- NA
d$clean_end_date[nchar(as.character(d$End_Date))<10] <- as.character(as.Date(d$End_Date[nchar(as.character(d$End_Date))<10], format="%m/%d/%y"))
d$clean_end_date[grep("[0-9]{4}/[0-9]{2}/[0-9]{2}", d$End_Date, value=F)] <- as.character(as.Date(grep("[0-9]{4}/[0-9]{2}/[0-9]{2}", d$End_Date, value=T, fixed = FALSE), format="%Y/%m/%d"))
d$clean_end_date[grep("[0-9]{4}-[0-9]{2}-[0-9]{2}", d$End_Date, value=F)] <- as.character(as.Date(grep("[0-9]{4}-[0-9]{2}-[0-9]{2}", d$End_Date, value=T, fixed = FALSE), format="%Y-%m-%d"))
d$clean_end_date[grep("[0-9]{2}/[0-9]{2}/[0-9]{4}", d$End_Date, value=F)] <- as.character(as.Date(grep("[0-9]{2}/[0-9]{2}/[0-9]{4}", d$End_Date, value=T, fixed = FALSE), format="%d/%m/%Y"))
d$clean_end_date[d$Community_id==42 & nchar(as.character(d$End_Date))==10] <- as.character(as.Date(d$End_Date[d$Community_id==42 & nchar(as.character(d$End_Date))==10], format="%m/%d/%Y")) 

但是,我在格式化“2015 年 11 月 31 日”和“2014 年 2 月 29 日”格式的日期时遇到了困难。我怀疑这可能是因为 R 无法区分这种格式和相同长度的格式,如“2015/11/31”和“02-29-2014”。

我真的很感激这方面的帮助。我对 R 相当陌生,所以特别感谢一个不假设我能流利地说 R 语言的答案。

4

1 回答 1

1

我建议反思guess_format上述lubridate软件包中可用的功能。

例子

给定一组日期,引用上面链接的官方帮助中的示例:

x <- c('February 20th 1973',
       "february  14, 2004",
       "Sunday, May 1, 2000",
       "Sunday, May 1, 2000",
       "february  14, 04",
       'Feb 20th 73',
       "January 5 1999 at 7pm")

我们可以guess_format通过以下方式申请:

require(lubridate)
as.Date(x = x, format = guess_formats(x, "mdy"))

结果

这将匹配一些日期:

>> as.Date(x = x, format = guess_formats(x, "mdy"))
 [1] "1973-02-20" "2004-02-14" "2000-05-01" "2000-05-01" "2004-02-14" "1973-02-20" NA           NA          
 [9] NA           "2000-05-01" NA           NA 

您可以探索不同的方法guess_format,原则上,它应该导致比 grep 的多个组合更简洁的代码

于 2016-11-21T21:55:23.350 回答