R中向量的输出类型

Ale*_*kov 4 r date list vector

关于R中的向量,我有一个非常基本的问题.我想创建一个空向量并为其添加日期.但是,R将日期转换为"数字",即

library(lubridate)
a <- c()
a <- c(a,now())
class(a)
Run Code Online (Sandbox Code Playgroud)

结果是

[1] "numeric"
Run Code Online (Sandbox Code Playgroud)

同时,这段代码完全符合我的要求:

  a <- c(now())
  a <- c(a,now())
  class(a)
Run Code Online (Sandbox Code Playgroud)

即班级现在是正确的:

[1]"POSIXct""POSIXt"

问题是我不想用任何日期初始化我的向量,即我希望它在开头是空的.

我曾尝试使用list然后"取消列出"它(因为我想要将这些日期作为参数传递给max()之后的函数)但它也给了我数字:

a  <- list()
a[[1]] <- now()
a[[2]] <- now()
class(unlist(a))
Run Code Online (Sandbox Code Playgroud)

使用array也没有帮助我.

因此我有点卡住了.我已经阅读了有关r中矢量输出类型的文档,但找不到任何解决方案.如何创建一个空的日期,添加几个日期并最后得到日期?谢谢.

Jor*_*eys 6

请记住,在使用c()时不要初始化矢量,而是创建一个NULL值.您需要使用vector()启动向量来操作类:

> identical(c(),NULL)
[1] TRUE
> identical(c(),vector())
[1] FALSE
Run Code Online (Sandbox Code Playgroud)

除此之外,只要不涉及时区,@ juba的解决方案就可以了.如果有,您将获得以下内容:

> a <- vector()
> class(a) <- 'POSIXct'
> b <- as.POSIXct(as.character(Sys.time()),tz="GMT")
> b
[1] "2013-01-29 14:10:32 GMT"
> c(a,b)
[1] "2013-01-29 15:10:32 CET"
Run Code Online (Sandbox Code Playgroud)

为了避免这种情况,您最好复制属性,如下所示:

> attributes(X) <- attributes(b)
> a <- vector()
> b <- as.POSIXct(as.character(Sys.time()),tz="GMT")
> X <- c(a,b)
> attributes(X) <- attributes(b)
> X
[1] "2013-01-29 14:10:32 GMT"
Run Code Online (Sandbox Code Playgroud)

但无论如何你根本不应该考虑这个,原因很简单,附加一个向量是一个非常缓慢的过程,可能会让你陷入困境.如果你必须在向量中保存100个日期,最好使用Paul Hiemstra建议的lapply/sapply解决方案,或者启动你的向量,如:

> a <- vector("numeric",100)
> class(a) <- c('POSIXct','POSIXt')
Run Code Online (Sandbox Code Playgroud)

要么

> a <- vector("numeric",100)
> attributes(a) <- list(class=c("POSIXct","POSIXt"),tzone="CET")
Run Code Online (Sandbox Code Playgroud)