【问题标题】:R: Assign data frame column with POSIXct collectionR:使用 POSIXct 集合分配数据框列
【发布时间】:2019-01-15 13:15:10
【问题描述】:

我有一个 元素的集合(我知道我不能将 POSIXct 对象的集合保留为向量,这就是我在此示例中使用 list 的原因):

input_timestamps <- list(
  as.POSIXct("02.08.2018", format = "%d.%m.%Y", origin = "01.01.1970", tz = "UTC"),
  as.POSIXct("04.08.2018", format = "%d.%m.%Y", origin = "01.01.1970", tz = "UTC"),
  as.POSIXct("14.08.2018", format = "%d.%m.%Y", origin = "01.01.1970", tz = "UTC")
)

现在我需要将此列表作为列添加到data.frame。 目前的解决方案如下:

1.将POSIXct 对象转换为数字,将列表转换为向量

inputs_timestamps &lt;- unlist(lapply(input_timestamps, as.numeric))

2 - 将此向量作为POSIXct 对象添加到data.frame

inputs_df <- data.frame(timestamp = as.POSIXct(input_timestamps, format = "%d.%m.%Y", origin = "01.01.1970", tz = "UTC"), input = 1:3)

我相信可能有更好的方法来做到这一点。请分享您的经验!

【问题讨论】:

    标签: posixct r datetime dataframe posixct


    【解决方案1】:

    我知道我不能将 POSIXct 对象的集合保存为 矢量,这就是我在这个例子中使用列表的原因

    我不相信这是真的,请采取以下措施:

    > input_timestamps <- c('02.08.2018', '04.08.2018', '14.08.2018')
    > inputs_df <- data.frame(timestamp = as.POSIXct(input_timestamps, format = "%d.%m.%Y", tz = "UTC"), input = 1:3)
    > class(inputs_df$timestamp)
    [1] "POSIXct" "POSIXt" 
    > inputs_df
       timestamp input
    1 2018-08-02     1
    2 2018-08-04     2
    3 2018-08-14     3
    
    
    > input_timestamps <- as.POSIXct(c('02.08.2018', '04.08.2018', '14.08.2018'), format = "%d.%m.%Y", origin = "01.01.1970", tz = "UTC")
    > inputs_df <- data.frame(timestamp = input_timestamps, input = 1:3)
    > class(inputs_df$timestamp)
    [1] "POSIXct" "POSIXt" 
    > inputs_df
       timestamp input
    1 2018-08-02     1
    2 2018-08-04     2
    3 2018-08-14     3
    

    在任何一种情况下,您都可以使用向量简单地创建一个 data.frame,而无需在两者之间进行不必要的转换。

    更新

    如果您已经将它们存储为单独的对象,则可以执行以下操作。

    input_timestamp1 <- as.POSIXct("02.08.2018", format = "%d.%m.%Y", origin = "01.01.1970", tz = "UTC")
    input_timestamp2 <- as.POSIXct("04.08.2018", format = "%d.%m.%Y", origin = "01.01.1970", tz = "UTC")
    input_timestamp3 <- as.POSIXct("14.08.2018", format = "%d.%m.%Y", origin = "01.01.1970", tz = "UTC")
    
    input_timestamps <- c(input_timestamp1, input_timestamp2, input_timestamp3)
    

    input_timestamps <- c(
      as.POSIXct("02.08.2018", format = "%d.%m.%Y", origin = "01.01.1970", tz = "UTC"),
      as.POSIXct("04.08.2018", format = "%d.%m.%Y", origin = "01.01.1970", tz = "UTC"),
      as.POSIXct("14.08.2018", format = "%d.%m.%Y", origin = "01.01.1970", tz = "UTC")
    )
    

    【讨论】:

    • 很抱歉,如果最初的帖子具有误导性。在您的示例中,此集合分配有字符串变量的向量。但是,如果我已经有一些 POSIXct 变量,现在我想将它们放入一个集合中,以便可以将此集合插入到 data.frame 中?
    • 不要将它们存储在list 中,而是将它们存储在vector 中。如果它们已经存储在列表中,则按照@akrun 的示例使用do.call 方法。
    • 是的,可以将POSIXct 存储在vector 中,但如果那样我print(input_timestamps) 我得到了磨损的日期和时间 - 时区是错误的。我用“UTC”时区初始化日期,但是在检查向量时它是“EEST”。 list 不会发生这种情况,所以这就是使用它的原因。
    • 这与c() 剥离POSIXct 上的tzone 属性有关,然后默认为您的计算机是什么。您可以通过print(input_timestamps, tz = 'UTC)attributes(input_timestamps)$tzone &lt;- 'UTC' 来克服这个问题
    【解决方案2】:

    可以用do.call(c`将其转换为向量,而不是两步过程

    inputs_df <- data.frame(timestamp = do.call(c, input_timestamps), 
                                input = seq_along(input_timestamps))
    

    或者另一种选择是将list 更改为命名listmelt

    library(reshape2)
    melt(setNames(input_timestamps, seq_along(input_timestamps)))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-15
      • 2021-12-04
      • 2018-10-04
      • 2011-05-07
      • 2021-08-10
      • 2016-11-30
      • 1970-01-01
      相关资源
      最近更新 更多