2017-08-10 3 views
1

Peut-être que je suis en train de le faire, mais je construis une fonction pour analyser la colonne de date automatiquement en fonction du nombre de colonnes entrées.Parse datetimes dans apply, retourne un nombre au lieu de Date

données:

CreatedDate    LastModifiedDate 
2015-11-20T19:46:11.000Z 2015-11-20T19:46:11.000Z 
2015-11-21T02:54:54.000Z 2015-12-01T18:48:07.000Z 
2015-11-21T14:36:32.000Z 2015-11-21T14:36:32.000Z 
2015-11-21T16:03:41.000Z 2015-11-21T16:03:41.000Z 
2015-11-21T17:31:43.000Z 2015-11-21T17:55:13.000Z 




require(lubridate) 
require(magrittr 

parse_sf_hms <- function(subset) { 
    if(is.null(ncol(subset))){ 
    subset %>% ymd_hms(tz="America/New_York",quiet=TRUE) %>% as.Date(format="%m/%d/%Y") -> x 
    return(x) 
    } else { 
    apply(subset, 2, function(x) x %>% ymd_hms(tz="America/New_York",quiet=TRUE) %>% as.Date(format="%m/%d/%Y")) 
    return(x) 
    } 
} 

Ainsi, le problème est que lorsque j'utilise une colonne (ex df[,1] ou df[,c(CreatedDate)].), La fonction retourne correctement:

[1] "2015-11-20" "2015-11-21" "2015-11-21" "2015-11-21" 
[5] "2015-11-21" 

Mais quand je l'utilise plus . une colonne (ex df[,c(1,2)] ou df[,c('CreatedDate','LastModifiedDate')], au lieu que je reçois:

 CreatedDate LastModifiedDate 
[1,]  16759   16759 
[2,]  16760   16770 
[3,]  16760   16760 
[4,]  16760   16760 
[5,]  16760   16760 

Pourquoi le vecteur unique renvoie-t-il correctement la valeur de date au format alors que l'application ne le fait pas? Est-ce qu'un lapply, rbind approcherait mieux ici? Juste essayer de comprendre les comportements.

+5

Ne pas utiliser 'appliquer (sous-ensemble, 2, FUN)' comme il fait tout une matrice, qui contraint vos dates à un numérique. Essayez 'lapply (sous-ensemble, FUN)' à la place. – thelatemail

+0

Merci @thelatemail - qui répond à la partie la plus importante de ma question sur le comportement. – gscott

Répondre

3

Essayez ceci:

parse_sf_hms <- function(subset) { 
    if(is.null(ncol(subset))){ 
    subset %>% ymd_hms(tz="America/New_York",quiet=TRUE) %>% as.Date(format="%m/%d/%Y") -> x 
    return(x) 
    } else { 
    x <- lapply(subset, function(x) x %>% ymd_hms(tz="America/New_York",quiet=TRUE) %>% as.Date(format="%m/%d/%Y")) 
    return(x) 
    } 
} 

Comme thelatemail dit, utilisez lapply. En outre, il y a une erreur dans votre fonction .. ceci:

apply(subset, 2, function(x) x %>% ymd_hms(tz="America/New_York",quiet=TRUE) %>% as.Date(format="%m/%d/%Y")) 

doit être affecté à x:

x <- lapply(subset, function(x) x %>% ymd_hms(tz="America/New_York",quiet=TRUE) %>% as.Date(format="%m/%d/%Y"))