unlist колонка со списком дат в dplyr - PullRequest
0 голосов
/ 26 апреля 2018

Я смотрел на использование функции unnest () в tidyr для столбца со списками дат.

x <- seq(from= as.POSIXct('2011-01-01 14:00:00'),length.out=100,by = "hour")

y <- seq(from= as.POSIXct('2012-01-01 14:00:00'),length.out=100,by = "hour")
df <- data.frame(x,y)

Когда я пытаюсь создать список для каждой строки, а затем развернуть его. Я получаю следующую ошибку.

df %>% rowwise() %>% mutate(sequence = list(seq.POSIXt(x,y,"10 min"))) %>% unnest(sequence)

Ошибка: каждый столбец должен быть либо списком векторов, либо списком фреймов данных [последовательность]

Может ли кто-то еще помочь с этим? Я сделал это с числами, и функция unnest работает отлично. Однако он не работает со списками, содержащими дату / дату и время.

Ответы [ 3 ]

0 голосов
/ 26 апреля 2018

Мне не удалось воспроизвести ошибку, но я подумал, что может пригодиться альтернативный подход.

library(dplyr)
library(tidyr)

df %>% 
  rowwise() %>% 
  mutate(sequence = paste(seq.POSIXt(x, y, "10 min"), collapse=",")) %>%
  ungroup() %>%
  separate_rows(sequence, sep=",") %>%
  mutate(sequence = as.POSIXct(sequence))

OR

Если вы хотите использовать unnest, тогда

df %>% 
  rowwise() %>% 
  mutate(sequence = list(seq.POSIXt(x, y, "10 min"))) %>% 
  ungroup() %>%
  unnest(sequence)

Вывод:

   x                   y                   sequence           
   <dttm>              <dttm>              <dttm>             
 1 2011-01-01 14:00:00 2011-01-02 14:00:00 2011-01-01 14:00:00
 2 2011-01-01 14:00:00 2011-01-02 14:00:00 2011-01-01 14:10:00
 3 2011-01-01 14:00:00 2011-01-02 14:00:00 2011-01-01 14:20:00
 4 2011-01-01 14:00:00 2011-01-02 14:00:00 2011-01-01 14:30:00
 5 2011-01-01 14:00:00 2011-01-02 14:00:00 2011-01-01 14:40:00
...

Пример данных:

df <- structure(list(x = structure(c(1293870600L, 1293874200L, 1293877800L, 
1293881400L, 1293885000L, 1293888600L, 1293892200L, 1293895800L, 
1293899400L, 1293903000L), class = c("POSIXct", "POSIXt"), tzone = ""), 
    y = structure(c(1293957000L, 1293960600L, 1293964200L, 1293967800L, 
    1293971400L, 1293975000L, 1293978600L, 1293982200L, 1293985800L, 
    1293989400L), class = c("POSIXct", "POSIXt"), tzone = "")), .Names = c("x", 
"y"), row.names = c(NA, -10L), class = "data.frame")
0 голосов
/ 26 апреля 2018

Привести результат seq.POSIXt() во фрейм данных и составить список этого ...

x <- seq(from= as.POSIXct('2011-01-01 14:00:00'),length.out=100,by = "hour")
y <- seq(from= as.POSIXct('2012-01-01 14:00:00'),length.out=100,by = "hour")
df <- data.frame(x,y)

library(dplyr)
library(tidyr)

df %>% 
  rowwise() %>% 
  mutate(sequence = list(data.frame(seq.POSIXt(x, y, "10 min")))) %>% 
  unnest(sequence)

# # A tibble: 5,256,100 x 3
#    x                   y                   seq.POSIXt.x..y...10.min..
#    <dttm>              <dttm>              <dttm>                    
#  1 2011-01-01 14:00:00 2012-01-01 14:00:00 2011-01-01 14:00:00       
#  2 2011-01-01 14:00:00 2012-01-01 14:00:00 2011-01-01 14:10:00       
#  3 2011-01-01 14:00:00 2012-01-01 14:00:00 2011-01-01 14:20:00       
#  4 2011-01-01 14:00:00 2012-01-01 14:00:00 2011-01-01 14:30:00       
#  5 2011-01-01 14:00:00 2012-01-01 14:00:00 2011-01-01 14:40:00       
#  6 2011-01-01 14:00:00 2012-01-01 14:00:00 2011-01-01 14:50:00       
#  7 2011-01-01 14:00:00 2012-01-01 14:00:00 2011-01-01 15:00:00       
#  8 2011-01-01 14:00:00 2012-01-01 14:00:00 2011-01-01 15:10:00       
#  9 2011-01-01 14:00:00 2012-01-01 14:00:00 2011-01-01 15:20:00       
# 10 2011-01-01 14:00:00 2012-01-01 14:00:00 2011-01-01 15:30:00       
# # ... with 5,256,090 more rows
0 голосов
/ 26 апреля 2018

Если я не ошибаюсь data.frame не поддерживает список столбцов. Попробуйте заменить df <- data.frame(x,y) на df <- tibble::tibble(x, y)


library(dplyr)
library(tidyr)
x <- seq(from= as.POSIXct('2011-01-01 14:00:00'),length.out=100,by = "hour")

y <- seq(from= as.POSIXct('2012-01-01 14:00:00'),length.out=100,by = "hour")
df <- tibble::tibble(x,y)


df %>% rowwise() %>% mutate(sequence = list(seq.POSIXt(x,y,"10 min"))) %>% unnest(sequence)
#> # A tibble: 5,256,100 x 3
#>    x                   y                   sequence           
#>    <dttm>              <dttm>              <dttm>             
#>  1 2011-01-01 14:00:00 2012-01-01 14:00:00 2011-01-01 14:00:00
#>  2 2011-01-01 14:00:00 2012-01-01 14:00:00 2011-01-01 14:10:00
#>  3 2011-01-01 14:00:00 2012-01-01 14:00:00 2011-01-01 14:20:00
#>  4 2011-01-01 14:00:00 2012-01-01 14:00:00 2011-01-01 14:30:00
#>  5 2011-01-01 14:00:00 2012-01-01 14:00:00 2011-01-01 14:40:00
#>  6 2011-01-01 14:00:00 2012-01-01 14:00:00 2011-01-01 14:50:00
#>  7 2011-01-01 14:00:00 2012-01-01 14:00:00 2011-01-01 15:00:00
#>  8 2011-01-01 14:00:00 2012-01-01 14:00:00 2011-01-01 15:10:00
#>  9 2011-01-01 14:00:00 2012-01-01 14:00:00 2011-01-01 15:20:00
#> 10 2011-01-01 14:00:00 2012-01-01 14:00:00 2011-01-01 15:30:00
#> # ... with 5,256,090 more rows
...