web-dev-qa-db-ja.com

POSIXctの空のベクトルを作成する方法

POSIXctを入れることができるように、POSIXctの空のベクトルを作成したいと思います。

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

それは機能しません。何か案は?

23
user3022875

POSIX modeがないため、vector()だけでPOSIXctベクトルを初期化することはできません(すべてのモードタイプのリストについては、_?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" 
_

また、Originの日時の長さ10のベクトルに.POSIXct(integer(10))を使用することもできることに注意してください。

23
Rich Scriven

私は通常、物事をNAに初期化します。

as.POSIXct(rep(NA, 10))

この場合はうまく機能します。 @RichardScrivenの回答の内部で起こっていることを明示的に行っています---より長い議論については、そこにあるコメントを参照してください。

8
Gregor Thomas

私は グレガーの解決策 に行きます。私は最初に Rich Scrivenのソリューション を使用しましたが、後で以下の例に示すように、非NA要素の差を計算しようとするとエラーが発生しました

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

次の方法でPOSIXctベクトルを作成すると、基になる型は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)

上記のベクトルを、基になる型として文字で初期化されたPOSIXctの空のベクトルと組み合わせると、文字-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?

したがって、基になる型としてdoubleまたはintegerを使用して空のPOSIXctベクトルを初期化することをお勧めします。

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

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"
0
Datoraki