Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to make an empty vector of POSIXct

Tags:

r

posixct

I want to make an empty vector of POSIXct so that I can put a POSIXct in it:

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

That does not work. Any ideas?

like image 770
user3022875 Avatar asked Nov 21 '14 00:11

user3022875


4 Answers

Since there is no POSIX mode, you cannot initialize a POSIXct vector with vector() alone (see ?mode for a list of all mode types).

But we can use .POSIXct to create the vector from a character vector.

(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" 

Also note that you can also use .POSIXct(integer(10)) for a length 10 vector of origin date-times.

like image 118
Rich Scriven Avatar answered Nov 14 '22 05:11

Rich Scriven


I usually initialize things to NA:

as.POSIXct(rep(NA, 10))

works well in this case. It's explicitly doing what happens under-the-hood in @RichardScriven's answer---see the comments there for a longer discussion.

like image 30
Gregor Thomas Avatar answered Nov 14 '22 05:11

Gregor Thomas


This question now has an incredibly simple answer!

lubridate allows you to simply write, e.g., empty_df <- tibble(date = POSIXct())

like image 3
Justin Avatar answered Nov 14 '22 04:11

Justin


When creating a POSIXct vector in the following way, the underlying type becomes double:

> 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)

Combining the above vector with an empty vector of POSIXct initialized with character as the underlying type, results in a character-POSIXct vector:

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

... which cannot be plotted directly:

> 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?

I therefore prefer initializing my empty POSIXct vectors with double or integer as the underlying type:

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

Simple POSIXct plot

> 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...

When using double, the vector is also initialized with valid dates (which might or might not be preferable):

> .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"
like image 1
Datoraki Avatar answered Nov 14 '22 06:11

Datoraki