2014-11-25 34 views
0

我有两套日期查找字符串;无论是31.3.1431/3/14在R中格式化两种因子日期

我想将它们格式化为31-3-2014

现在我知道他们每个人如何格式化所需的格式,但我不知道如何区分它们,并应用该方法波纹管。

这种格式31.3.14

format(as.Date(as.character("31.3.14"), "%d.%m.%y"), "%d-%m-%Y") 

这种格式31/3/14

format(as.Date(as.character("31/3/14"), "%d/%m/%Y"), "%d-%m-%Y")) 

我有这各种各样的日期在数据帧列随机,所以我就需要申请给出的方法正确格式集。

编辑:对不起,我也有不同种类的日期,也:"2013-04-01"这里提供的dmy功能失败的解决方案。

回答

3

也可以与基础R由第一

Dates <- c("31.3.14", "31/3/14") 
format(as.Date(gsub("[[:punct:]]", "-", Dates), format = "%d-%m-%y"), "%d-%m-%Y") 
## [1] "31-03-2014" "31-03-2014" 
3

Hadley Wickham的Lubridate软件包使这一切变得简单。

> require(lubridate) 
> test <- data.frame(raw = c("31.3.14", "31/3/14")) 
> test$formatted <- dmy(test$raw) 
> test 
     raw formatted 
1 31.3.14 2014-03-31 
2 31/3/14 2014-03-31 

编辑: 基于编辑的问题,可以使用ifelse()函数内的日期字符串的开始来检测一个四位数的序列。

require(stringr) 
myDateFun <- function(x){ 
    z <- ifelse(str_detect(x, "^\\d{4}") == TRUE, 
       ymd(x), dmy(x)) 
    z <- as.POSIXlt(z, origin = "1970-01-01") 
    z <- format(z, "%Y-%m-%d") 
    return(z) 
} 
test <- data.frame(raw = c("31.3.14", "31/3/14", "2014-3-31")) 


test$formatted.2 <- myDateFun(test$raw) 
test 
     raw formatted formatted.2 
1 31.3.14 2014-03-31 2014-03-31 
2 31/3/14 2014-03-31 2014-03-31 
3 2014-3-31  <NA> 2014-03-31 
+0

(+1)移除标点符号感谢你这样做,但我已经开始用ifelse,但是这有点笨拙的解决方案。 – Maximilian 2014-11-25 18:46:01