2011-07-21 10 views
12

Por ejemplo, he intentado lo siguiente para crear un vector de fechas, duración 5. Ninguno de trabajo:R - ¿cómo declaro un vector de Fecha?

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

Esto funciona, pero pregunto si hay un acceso directo?

as.Date(numeric(5)) 

Además, veo que el modo (as.Date ("2011-01-01")) es numérico y entiendo que la estructura de datos subyacente para las fechas es numérico, pero dado que el vector() sólo tiene un argumento de modo y longitud, me parece que es imposible crear un vector de Fecha sin coacción?

Editar
¿Esta es también una solución, excepto por la longitud = 0?

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

¿Qué quieres que contenga la secuencia? – hadley

+5

@hadley - dates =) – SFun28

Respuesta

16

Se puede utilizar una secuencia, o simplemente basta con añadir:

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> 

y que ambos funcionan de la misma manera es un buen ejemplo de por qué la orientación a objetos es agradable para la programación con los datos.

La fecha, como viste, tiene una representación numérica subyacente (de enteros que representan el número de días desde el comienzo del tiempo Unix, también conocido como 1 de enero de 1970) pero también tiene un atributo de clase que hace el formateo, aritmética ... se comportan de la manera que lo hace utilizando el mecanismo de entrada en R.

Editar: Por la misma razón, también puede comenzar con un vector estándar y convertirlo en un objeto Date:

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

'structure' proporciona otra forma:' structure (numeric (5), class = "Date") 'or' structure (1: 3, class = "Date") '. –

+0

@Dirk, Joshua - ¡gracias! podrías echar un vistazo a la edición de mi publicación. Además de ocultar la función de fecha de compilación(), ¿esta solución también funciona? Esta función parece más en línea con numérico(), etc. como una forma de declarar un vector de fechas – SFun28

+0

@ SFun28: Yo usaría 'Date()' en lugar de 'date()' porque 'base :: date () 'existe y la clase es" Fecha ", no" fecha ". –

5

Para inicializar con fechas perdidas en lugar de un montón de 1970-01-01s :

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

¡Genial! Incluso puedes usar eso como 'structure (rep (NA_real_, 1), class = c (" POSIXct "," POSIXt ")' – Christoph

Cuestiones relacionadas