Я хочу создать пустой вектор POSIXct
, чтобы я мог поместить в него POSIXct
:
vec <- vector("POSIXct", 10)
vec
vec[1] <- "2014-10-27 18:11:36 PDT"
vec
Это не работает. Любые идеи?
Я хочу создать пустой вектор POSIXct
, чтобы я мог поместить в него POSIXct
:
vec <- vector("POSIXct", 10)
vec
vec[1] <- "2014-10-27 18:11:36 PDT"
vec
Это не работает. Любые идеи?
Поскольку POSIX mode
отсутствует, вы не можете инициализировать вектор POSIXct
только с vector()
(см. ?mode
для списка всех типов режимов).
Но мы можем использовать .POSIXct
для создания вектора из символьного вектора.
(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"
Также обратите внимание, что вы также можете использовать .POSIXct(integer(10))
для длины 10 векторов даты начала.
Я обычно инициализирую вещи до NA
:
as.POSIXct(rep(NA, 10))
хорошо работает в этом случае. Он явно делает то, что происходит под капотом в ответе @RichardScriven, - см. Комментарии там для более продолжительного обсуждения.
При создании вектора POSIXct следующим образом, базовый тип становится двойным:
> 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)
Объединение указанного выше вектора с пустым вектором POSIXct, инициализированным символом в качестве базового типа, приводит к вектору character-POSIXct:
> tm1 <- c(.POSIXct(character(0)), times)
> typeof(tm1)
[1] "character"
..., которые невозможно построить напрямую:
> 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?
Поэтому я предпочитаю инициализировать мои пустые векторы POSIXct двойным или целым числом в качестве базового типа:
> 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...
При использовании double вектор также инициализируется действительными датами (которые могут быть или не предпочтительнее):
> .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"
Я бы пошел на решение Грегора. Сначала я использовал решение Rich Scriven, но затем получил ошибку, когда позже попытался вычислить разницу для элемента NA
Non-, как показано в примере ниже.
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
Это может даже привести к таким странным ошибкам, как эта, которая может занять некоторое время, чтобы обнаружить
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