R-将不同的日期格式强制转换为一种

时间:2018-10-17 19:37:57

标签: r date

我导入了一个要在R中处理的凌乱的电子表格。有一个日期字段,该字段可能会以三种方式出现(在任何位置以任何顺序显示):

  • 文字为ddt <- "2018-01-01"
  • 编号为ddn <- 43101
  • 文本为dde <- "43102"

以下功能将自动检测并将这三种格式转换为所需的“%YY-%m-%d”:

coerce.Date <- function (date, origin = "1900-01-01", format = "%Y-%m-%d"){
  out <- ifelse(is.na(as.numeric(date)),date,as.numeric(date))
  as.Date(out,origin = origin, format = format)
}

因此:

dd <- c(ddt,ddn,dde)

dates <- lapply(dd,coerce.Date)

str(dates)

List of 3
 $ : Date[1:1], format: "2018-01-01"
 $ : Date[1:1], format: "2018-01-04"
 $ : Date[1:1], format: "2018-01-03"

太好了。但是,回到向量时,它会给我:

unlist(dates)

[1] 17532 17535 17534

我得到的解决方法是:

dates <- tibble(dates)

unnest (dates)

# A tibble: 3 x 1
  dates        
  <date>   
1 2018-01-01
2 2018-01-04
3 2018-01-03

有没有更简单的方法?

PS:我也尝试过sapply,但结果却更加令人困惑

1 个答案:

答案 0 :(得分:1)

只需再次添加类,这也可以避免出现警告:

ddt <- "2018-01-01"
ddn <- 43101
dde <- "43102"

dd <- c(ddt,ddn,dde)

coerce.Date <- function (dateVar, origin = "1900-01-01", format = "%Y-%m-%d"){
  if(!identical(grep("^[[:digit:]]*$", dateVar), integer(0))){
    out <- as.Date(as.numeric(dateVar),origin = origin, format = format)
  } else {
    out <- as.Date(dateVar, origin = origin, format = format)
  }
  return(out)
}

myDates <- lapply(dd, coerce.Date)

class(myDates) <- "Date"

myDates