【问题标题】:Output type of vector in RR中向量的输出类型
【发布时间】:2013-01-13 01:09:36
【问题描述】:

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

library(lubridate)
a <- c()
a <- c(a,now())
class(a)

结果

[1] "numeric"

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

  a <- c(now())
  a <- c(a,now())
  class(a)

即该类现在是正确的:

[1] "POSIXct" "POSIXt"

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

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

a  <- list()
a[[1]] <- now()
a[[2]] <- now()
class(unlist(a))

使用array 也对我没有帮助。

所以我有点卡住了。我已阅读有关 r 中向量输出类型的文档,但找不到任何解决方案。如何创建一个空的日期向量,附加几个日期并最终获取日期?谢谢。

【问题讨论】:

  • 我强烈建议您重新考虑附加到向量的计划。几乎总是有更有效的解决方案。
  • @JoshuaUlrich 谢谢。我知道它没有效率。我只是对向量的这种特殊行为感到困惑。

标签: r list date vector


【解决方案1】:

你可以试试这个:

library(lubridate)
a <- vector()
class(a) <- "POSIXct"
a <- c(a, now())
class(a)
[1] "POSIXct" "POSIXt" 

【讨论】:

  • 感谢您的及时答复。将一个类分配给一个空向量会给我一个奇怪的“尝试将属性设置为 NULL”错误。所以你我想应该在添加元素后这样做。这样就可以了。
  • @JorisMeys 是的,当然,lubridate 只需要 now() 函数。
  • @Juba 对不起我的错误。我使用的是c() 而不是vector()
  • @juba 对,我已经想知道Sys.time() 的包装器来自哪里:-)
  • @juba 抱歉,造成混乱。我将更新问题以包括对lubridate 的引用
【解决方案2】:

一般情况下,不需要以空向量开头。你可以用这样的日期创建一个向量:

date_vec = lapply(1:10, function(x) return(Sys.time()))
> date_vec                                                                  
[[1]]                                                                       
[1] "2013-01-29 13:53:29 CET"                                               

[[2]]                                                                       
[1] "2013-01-29 13:53:29 CET"                                               

[[3]]                                                                       
[1] "2013-01-29 13:53:29 CET"                                               

[[4]]                                                                       
[1] "2013-01-29 13:53:29 CET"                                               

[[5]]
[1] "2013-01-29 13:53:29 CET"

[[6]]
[1] "2013-01-29 13:53:29 CET"

[[7]]
[1] "2013-01-29 13:53:29 CET"

[[8]]
[1] "2013-01-29 13:53:29 CET"

[[9]]
[1] "2013-01-29 13:53:29 CET"

[[10]]
[1] "2013-01-29 13:53:29 CET"

或者,我经常使用 strptime 从表示日期的字符串创建日期向量。

【讨论】:

    【解决方案3】:

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

    > identical(c(),NULL)
    [1] TRUE
    > identical(c(),vector())
    [1] FALSE
    

    接下来,只要不涉及时区,@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"
    

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

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

    但无论如何,您根本不应该考虑这一点,原因很简单,附加矢量是一个非常缓慢的过程,可能会给您带来麻烦。如果您必须在向量中保存 100 个日期,您最好使用 Paul Hiemstra 建议的 lapply/sapply 解决方案,或者您像这样启动向量:

    > a <- vector("numeric",100)
    > class(a) <- c('POSIXct','POSIXt')
    

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

    【讨论】:

    • +1 以获得更详细的答案和时区问题!
    • 谢谢。 POSIXt 类和时区是个混蛋,我经常被它们咬到腿上 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-02
    • 2021-04-11
    • 2016-08-18
    • 1970-01-01
    相关资源
    最近更新 更多