2015-02-19 3 views
0

У меня есть кадр данных (тест), который выглядит следующим образом:Преобразование даты с различными форматами в кадре данных по нескольким столбцам

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"

Update (20 февраля 2015): Благодаря комментарий Ричарда я получил эту работу (на самом деле, как Grep ("улица (статья | оп)":

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")))}) 
+1

последней строки в функции г является его возвращаемым значением. вы должны переместить 'rm (z)' где-то еще или просто удалить его вообще, так как это не нужно. И вы неправильно вызываете 'dateconv' для ввода. Вы должны использовать 'lapply' или подобное, например' lapply (test [, grep ("^ start", names (test))], dateconv) ' – rawr

+0

Возможный дубликат [Как изменить несколько форматов даты в одном столбце] (http : //stackoverflow.com/questions/13764514/how-to-change-multiple-date-formats-in-same-column) – Metrics

ответ

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) 
+0

Спасибо, Ричард. Получил его для работы с небольшим modificaiton.g. <- grep («st (art | op)», имена (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"))) }) –

0

Ваш самый простой вариант использовать mdy() из пакет lubridate:

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