使用sapply()

时间:2015-07-17 08:43:36

标签: r

我在R中遇到日期问题。

我有一些日期数据,但格式不一致。根据当天的日期,它存储为dmmyyyy或ddmmyyyy。为了解决这个问题,我编写了一个小函数(见下文),它接受字符串,检查长度,重新格式化然后返回日期。我使用sapply(日期,formatDate)并根据我的打印输出一切正常工作。但是,结果向量不包含相同的值。

  

头(日期)   10651 11566 15493 13727 15920 15617

我不确定这里发生了什么,有什么见解吗?

formatDate <- function(x){

  print(paste("Entering format date for ", x))

  if (nchar(x) == 8){

    print(paste("nchar = ", nchar(x)))

    day   <- substr(x, 1, 2)
    month <- substr(x, 3, 4)
    year  <- substr(x, 5, 8)

    print(paste("Day = ", day, " month = ", month, " year = ", year))

    x  <- paste(year,"-",month,"-",day, sep = "")

    print(paste("Date = ", x))

    x  <- as.Date(x, format = "%Y-%m-%d")

  }else if (nchar(x) == 7){

    day   <- substr(x, 1, 1)
    day   <- format(day, digits = 2)
    day   <- gsub(" ", 0, day)
    month <- substr(x, 2, 3)
    year  <- substr(x, 4, 7)

    x  <- paste(year,"-",month,"-",day, sep = "")
    x  <- as.Date(x, format = "%Y-%m-%d")

  } else {

    x <- NA

  }

  print(paste("Returning", x))
  flush.console()
  return(x)

 } 

2 个答案:

答案 0 :(得分:2)

这看起来太复杂了。如果我理解正确,你可以这样做:

x <- c("1072015", "11072015")
as.Date(formatC(as.integer(x), width = 8, flag = 0), format = "%d%m%Y")
#[1] "2015-07-01" "2015-07-11"

答案 1 :(得分:0)

尽管Roland是正确的,这需要一种完全不同的方法,但实际上我在寻找OP问题的答案:使用sapply()从函数返回日期。

简单的答案是:sapply()无法返回日期。但是,如果您想使用sapply()强制日期,则可以将as.Date()与正确的origin一起使用来返回日期。日期和功能示例:

dates <- c("October 21 2012", "Sep 22 2019")

guess_date <- function(x) {
  # just for test purposes: try to coerce 2 different date formats
  if (is.na(as.Date(x, "%b %d %Y"))) {
    # format mmm dd yyyy
    return(as.Date(x, "%b %d %Y"))
  } else {
     # format mmmm dd yyyy
    return(as.Date(x, "%B %d %Y"))
  }
}

因此guess_date()将始终返回类Date。但是现在用sapply()进行检查:

sapply(dates, guess_date)
#> October 21 2012     Sep 22 2019 
#>           15634           18161 

以及您要查找的内容:

as.Date(sapply(dates, guess_date), origin = "1970-01-01")
#> October 21 2012     Sep 22 2019 
#>    "2012-10-21"    "2019-09-22"