2011-07-21 11 views
12

Par exemple, j'ai essayé ce qui suit pour créer un vecteur de dates, durée 5. Aucun travail:R - Comment déclarer un vecteur de Date?

date(5) 
Date(5) 
vector(5, mode = "Date") 

Cela fonctionne, mais demandent s'il y a un raccourci?

as.Date(numeric(5)) 

De plus, je vois que le mode (as.Date (« 2011-01-01 »)) est numérique et je comprends que la structure de données sous-jacentes pour les dates est numérique, mais étant donné que le vecteur() ne dispose un argument de mode et de longueur, il me semble qu'il est impossible de créer un vecteur de Date sans coercition?

Édition
Ceci est également une solution, sauf pour la longueur = 0?

Date = function(length = 0) 
{ 
    newDate = numeric(length) 
    class(newDate) = "Date" 
    return(newDate) 
} 
+0

Que voulez-vous que la séquence contienne? – hadley

+5

@hadley - dates =) – SFun28

Répondre

16

Vous pouvez utiliser une séquence, ou tout simplement il suffit d'ajouter:

R> seq(as.Date("2011-07-01"), by=1, len=3) 
[1] "2011-07-01" "2011-07-02" "2011-07-03" 
R> as.Date("2011-07-01") + 0:2 
[1] "2011-07-01" "2011-07-02" "2011-07-03" 
R> 

et que les deux fonctionnent de la même façon est une belle illustration de pourquoi l'orientation objet est agréable pour la programmation avec des données. Comme vous l'avez vu, la date a une représentation numérique sous-jacente (des nombres entiers représentant le nombre de jours écoulés depuis le début de l'heure Unix, soit le 1er janvier 1970), mais elle a aussi un attribut de classe qui rend le formatage arithmétique. ... se comporter comme il le fait en utilisant le mécanisme de répartition dans l'affaire R.

Edit: de même, vous pouvez également commencer par un vecteur standard et la transformer en un objet Date:

R> x <- 1:3 
R> class(x) <- "Date" 
R> x 
[1] "1970-01-02" "1970-01-03" "1970-01-04" 
R> 
+3

'structure' fournit un autre moyen:' structure (numeric (5), class = "Date") 'ou' structure (1: 3, class = "Date") '. –

+0

@Dirk, Joshua - merci! Pourriez-vous jeter un oeil à l'édition de mon message. En plus de masquer la fonction date() intégrée, cette solution fonctionne-t-elle également? Cette fonction semble plus en ligne avec numeric(), etc .. comme un moyen de déclarer un vecteur de dates – SFun28

+0

@ SFun28: J'utiliserais 'Date()' au lieu de 'date()' car 'base :: date () 'existe et la classe est" Date "pas" date ". –

5

Initialiser avec des dates manquantes au lieu d'un groupe de 1970-01-01 :

(x = structure(rep(NA_real_, 10), class="Date")) 
# [1] NA NA NA NA NA NA NA NA NA NA 
class(x) 
# [1] "Date" 
+0

Cool! Vous pouvez même utiliser cela comme 'structure (rep (NA_real_, 1), class = c (" POSIXct "," POSIXt ")' – Christoph

Questions connexes