2013-01-21 5 views
4

J'ai importé un fichier CSV avec de nombreuses dates et j'ai utilisé la fonction as.Date pour convertir la date. Cependant, lorsque j'utilise la fonction mapply pour trouver la première de deux dates, je me retrouve avec une liste avec des dates ou un vecteur numérique. Comment puis-je obtenir un vecteur avec des dates?Dates avec lapply et sapply

POP.Start.final <- mapply(min, combinedOM$Cons.Start.Date.y, 
           combinedOM$OS.Start.Date.y, 
           MoreArgs = list(na.rm=T),SIMPLIFY=T) 

Cela renvoie un vecteur numérique, le passage à SIMPLIFIER = F retourne une liste de dates, mais je veux un vecteur de dates.

Répondre

7

Dans ce cas précis, je crois pmin le tour est joué:

POP.Start.final <- pmin(combinedOM$Cons.Start.Date.y, 
    combinedOM$OS.Start.Date.y, 
    na.rm=TRUE) 

Dans le cas général, SIMPLIFY=TRUE (par défaut) utilise la fonction d'utilitaire simplify2array pour convertir les listes en vecteurs du mode atomique via as.vector. Parce que les dates sont stockées en interne en tant que numérique, SIMPLIFY=TRUE convertira la liste des dates en un vecteur de mode numérique et supprimera la classe Date. Vous pouvez définir SIMPLIFY=FALSE pour conserver la classe Date, puis utiliser do.call avec c pour convertir la liste en vecteur.

POP.Start.final <- do.call(c,mapply(min, combinedOM$Cons.Start.Date.y, 
           combinedOM$OS.Start.Date.y, 
           MoreArgs = list(na.rm=TRUE),SIMPLIFY=FALSE)) 

Certains codes reproductibles:

a <- as.Date(c("2012-01-11","2012-06-30","2012-04-18")) 
b <- as.Date(c("2013-04-21","2012-03-22","2012-05-01")) 
pmin(a,b) 
#[1] "2012-01-11" "2012-03-22" "2012-04-18" 
do.call(c,mapply(min,a,b,MoreArgs=list(na.rm=TRUE),SIMPLIFY=FALSE)) 
#[1] "2012-01-11" "2012-03-22" "2012-04-18" 

En aparté, en utilisant T et F pour TRUE et FALSE est inquiétant parce que peu T et F peuvent être réaffectés en TRUE et FALSE ne peuvent pas être réaffectés.

+0

Oups. Votre réponse a été la première, mais elle semblait plus complexe que nécessaire. Je vais supprimer le mien dans un peu. –

+0

Pas de soucis. J'essaie de couvrir les bases quand une fonction de base astucieuse n'est pas disponible, donc nos réponses peuvent être complémentaires. –

+0

Votre explication de la conversion des dates en chiffres est légèrement décalée. 'SIMPLIFY = TRUE' appelle' simplify2array', qui convertit son argument en un vecteur ou une matrice, et 'is.vector (Sys.Date())' est 'FALSE'. Cela n'a rien à voir avec le "type le plus simple". –

1

Je ne sais pas si cela est la meilleure façon, mais le origin de la fonction as.Date est January 1, 1970 ou 1970-01-01 dans le format de date par défaut.

donc (avec composées de données remplaçant le vôtre), cela fonctionnera:

> one <- as.Date("2012-01-01") 
> two <- as.Date("2012-03-13") 
> 
> POP.Start.final <- as.Date(
          mapply(min, 
            one, 
            two, 
            MoreArgs=list(na.rm=T) 
            ), 
            origin="1970-01-01" 
          ) 
> str(POP.Start.final) 
Date[1:1], format: "2012-01-01" 
Questions connexes