vectores vacio eliminar datos data crear convertir ceros r posixct

vacio - vector de ceros en r



Cómo hacer un vector vacío de POSIXct (4)

Quiero hacer un vector vacío de POSIXct para poder poner un POSIXct en él:

vec <- vector("POSIXct", 10) vec vec[1] <- "2014-10-27 18:11:36 PDT" vec

Eso no funciona. ¿Algunas ideas?


Al crear un vector POSIXct de la siguiente manera, el tipo subyacente se vuelve doble:

> times <- as.POSIXct(c("2015-09-18 09:01:05.984 CEST", "2015-09-18 10:01:10.984 CEST", "2015-09-18 10:21:20.584 CEST")) > typeof(times) [1] "double" > values <- c(5,6,7)

La combinación del vector anterior con un vector vacío de POSIXct inicializado con el carácter como el tipo subyacente, da como resultado un vector de carácter POSIXct:

> tm1 <- c(.POSIXct(character(0)), times) > typeof(tm1) [1] "character"

... que no se puede trazar directamente:

> ggplot() + geom_line(aes(x=tm1, y=val), data=data.frame(tm1,val)) geom_path: Each group consist of only one observation. Do you need to adjust the group aesthetic?

Por lo tanto, prefiero inicializar mis vectores POSIXct vacíos con doble o entero como tipo subyacente:

> tm2 <- c(.POSIXct(double(0)), times) > typeof(tm2) [1] "double" > ggplot() + geom_line(aes(x=tm2, y=val), data=data.frame(tm2,val))

> tm3 <- c(.POSIXct(integer(0)), times) > typeof(tm3) [1] "double" > ggplot() + geom_line(aes(x=tm3, y=val), data=data.frame(tm3,val)) #Same thing...

Cuando se usa doble, el vector también se inicializa con fechas válidas (lo que podría o no ser preferible):

> .POSIXct(character(10)) [1] NA NA NA NA NA NA NA NA NA NA > .POSIXct(double(10)) [1] "1970-01-01 01:00:00 CET" "1970-01-01 01:00:00 CET" "1970-01-01 01:00:00 CET" "1970-01-01 01:00:00 CET" "1970-01-01 01:00:00 CET" "1970-01-01 01:00:00 CET" [7] "1970-01-01 01:00:00 CET" "1970-01-01 01:00:00 CET" "1970-01-01 01:00:00 CET" "1970-01-01 01:00:00 CET"


Como no hay mode POSIX, no puede inicializar un vector POSIXct con vector() solo (consulte el ?mode Para obtener una lista de todos los tipos de modo).

Pero podemos usar .POSIXct para crear el vector a partir de un vector de caracteres.

(x <- .POSIXct(character(10))) ## the same as .POSIXct(vector("character", 10)) # [1] NA NA NA NA NA NA NA NA NA NA class(x) # [1] "POSIXct" "POSIXt"

También tenga en cuenta que también puede usar .POSIXct(integer(10)) para un vector de longitud 10 de origen-fecha.


Iría por la solución de Gregor . Primero tomé la solución de Rich Scriven, pero luego obtuve un error cuando intenté calcular la diferencia para un elemento que no era de NA más adelante, como se muestra en el siguiente ejemplo.

t1 <- as.POSIXct("2014-10-27 18:11:36 PDT") t2 <- as.POSIXct("2014-11-20 18:11:36 PDT") x <- .POSIXct(character(10)) x[1] <- t1 difftime(t2, t1) #R Time difference of 24 days # fails difftime(t2, x[1]) #R Error in unclass(time1) - unclass(time2) : #R non-numeric argument to binary operator unclass(x[1]) # character #R [1] "1414429896" unclass(t1) #R [1] 1414429896 #R attr(,"tzone") #R [1] "" x <- .POSIXct(rep(NA_real_, 10)) x[1] <- t1 difftime(t2, x[1]) # all good #R Time difference of 24 days

Esto puede llevar incluso a errores extraños como este, que pueden tardar un rato en descubrirse.

t1 <- as.POSIXct("2001-07-24 CEST") t2 <- as.POSIXct("2002-08-29 CEST") x <- .POSIXct(character(10)) x[1] <- t1 t2 < t1 #R [1] FALSE t2 < x[1] # oh boy #R [1] TRUE # the reason (I think) unclass(t2) #R [1] 1030572000 #R attr(,"tzone") #R [1] "" unclass(x[1]) #R [1] "995925600" "995925600" > 1030572000 #R [1] TRUE


Por lo general inicializo las cosas a NA :

as.POSIXct(rep(NA, 10))

Funciona bien en este caso. Está haciendo explícitamente lo que sucede debajo del capó en la respuesta de @ RichardScriven: vea los comentarios para una discusión más larga.