R:使用 POSIXct 集合分配数据框列

R: Assign data frame column with POSIXct collection

我有一个 元素的集合(我知道我不能将 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 <- unlist(lapply(input_timestamps, as.numeric))

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

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

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

可以使用 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)))

I know I cannot keep the collection of the POSIXct objects as a vector, that is why I used list in this example

我不相信这是真的,请看以下内容:

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