R: Назначить столбец фрейма данных с коллекцией POSIXct - PullRequest
0 голосов
/ 15 января 2019

У меня есть коллекция элементов (я знаю, что не могу сохранить коллекцию 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)

Я считаю, что мог бы быть лучший способ сделать это. Пожалуйста, поделитесь своим опытом!

Ответы [ 2 ]

0 голосов
/ 15 января 2019

Я знаю, что не могу сохранить коллекцию объектов 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, используя вектор без ненужных преобразований между ними.

UPDATE

Если вы уже сохранили их как отдельные объекты, вы можете сделать следующее.

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)

OR

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")
)
0 голосов
/ 15 января 2019

Вместо двухэтапного процесса его можно преобразовать в вектор с помощью do.call( c``

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

Или другой вариант - изменить list на именованные list и melt

.
library(reshape2)
melt(setNames(input_timestamps, seq_along(input_timestamps)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...