在多个列的数据框中转换具有不同格式的日期

时间:2015-02-19 22:10:47

标签: r as.date

我的数据框(测试)看起来像这样:

    abx   start      stop       abx2    start2     stop2     abx3 start3 stop3
    cipro 07/10/12   07/10/12   flagyl  07/10/12   07/17/12   n/a   n/a   n/a
    vanco 07/12/2012 07/15/2012 levo    07/20/2012 07/27/2012 n/a  n/a    n/a

这一直持续到start9 / stop9。我想将所有日期转换为标准日期格式。

我写了一个函数来根据日期中的字符数转换开始日期。计划为止损写一个类似的功能。

    dateconv <- function(x) { 
    as.character(x)
    z <- ifelse(nchar(x) == 8, "y","Y")
    date <- as.Date(x, format =paste0("%m/%d/%", z))
    rm(z)
    }
    test[,grep("^start", names(test))] <- dateconv(test[,grep("^start",         
   names(test))])

任何想法我做错了什么?得到此错误:   as.Date.default中出错(x,format = paste0(“%m /%d /%”,z)):   不知道如何将'x'转换为类“Date”

更新(2015年2月20日): 感谢理查德的评论我得到了这个工作(真的像grep(“st(art | op)”:

    g <- grep("st(art|op)", names(test), value = TRUE)

    test[g] <- lapply(test[g], function(x) {
     x <- as.character(x)
      as.Date(x, format = paste0("%m/%d/%", ifelse(nchar(x) == 8, "y",       "Y")))})

2 个答案:

答案 0 :(得分:1)

以下是更改test数据框的一种方法。

g <- grep("st(art|op)", names(test), value = TRUE)

test[g] <- lapply(test[g], function(x) {
    x <- as.character(x)
    as.Date(x, format = paste0("%m/%d/%", ifelse(nchar(x) == 8, "y", "Y")))
}))

给出了

#     abx      start       stop   abx2     start2      stop2 abx3 start3 stop3
# 1 cipro 2012-07-10 2012-07-10 flagyl 2012-07-10 2012-07-17  n/a   <NA>  <NA>
# 2 vanco 2012-07-12 2012-07-15   levo 2012-07-20 2012-07-27  n/a   <NA>  <NA>

test

的位置
test <- read.table(text = "abx   start      stop       abx2    start2     stop2     abx3 start3 stop3\n    cipro 07/10/12   07/10/12   flagyl  07/10/12   07/17/12   n/a   n/a   n/a\n    vanco 07/12/2012 07/15/2012 levo    07/20/2012 07/27/2012 n/a  n/a    n/a", header = TRUE, stringsAsFactors=FALSE)

答案 1 :(得分:0)

最简单的方法是使用lubridate包中的mdy()

library(lubridate)
dateFields <- grep('^(start|stop)',names(test),value=T)
test[,dateFields] <- lapply(test[,dateFields],mdy)