Эффективный подход (ы) для преобразования кадра данных (или tibble) в tsibble - PullRequest
0 голосов
/ 05 января 2020

Я хотел бы спросить о предложениях по наиболее эффективному подходу (ам) для преобразования фрейма данных (или таблицы) в циббл.

Фрейм данных имеет даты в первом столбце, а все остальные столбцы представляют различные временной ряд со значениями, указанными на соответствующую дату. Я хотел бы эффективно создать циббл с ключом = именем каждого временного ряда и индексом = каждой датой.

Таким образом, на выходе будет циббл, который будет выглядеть так:

Key                  Index             Value
TimeSeriesOne       FirstDate        Value TimeSeriesOne on first date
TimeSeriesOne       SecondDate       Value TimeSeriesOne on second date
......................................................................
TimeSeriesOne       LastDate         Value TimeSeriesOne on last date
TimeSeriesTwo       FirstDate        Value TimeSeriesTwo on first date
......................................................................
TimeSeriesN         LastDate         Value TimeSeriesN on last date

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

numRows <- 15
startDate <- lubridate::as_date('2018-06-10')
endDate <- startDate + base::months(x = numRows-1)
theDates <- base::seq.Date(
    from = startDate,
    to = endDate,
    by = "month")  
inputData <- tibble::tibble(
    "Dates" = theDates,
    "SeriesOne" = stats::rnorm(numRows),
    "SeriesTwo" = stats::rnorm(numRows),
    "SeriesThree" = stats::rnorm(numRows), 
    "SeriesFour" = stats::rnorm(numRows))

Ответы [ 3 ]

2 голосов
/ 05 января 2020

Вы можете преобразовать в «длинный формат», используя tidyr:

tsibble_input <- tidyr::pivot_longer(inputData, cols = -Dates, names_to = "Key", values_to = "Value") 

И получить tsibble:

tsibble::as_tsibble(tsibble_input, index = "Dates", key = "Key")
1 голос
/ 05 января 2020

Преобразовать в зоопарк, а затем в длинный фрейм данных и, наконец, в tsibble

library(tsibble)
library(zoo)

inputData %>%
  read.zoo %>%
  fortify.zoo(melt = TRUE) %>%
  as_tsibble(key = "Series", index = "Index")

или использовать stack (или любую из ряда других функций изменения формы, включая изменение формы, плавление, сборку, pivot_longer) в создать длинный фрейм данных, а затем циббл. Если под эффективными вы подразумеваете минимальные предварительные условия, то здесь используются только пакет tsibble и его зависимости.

library(tsibble)

inputData %>%
  { cbind(.[1], stack(.[-1])) } %>%
  as_tsibble(key = "ind", index = "Dates")
1 голос
/ 05 января 2020

Мы можем использовать melt из data.table, чтобы сделать это эффективно, а затем преобразовать его в tibble

library(data.table)
library(tibble)
as_tibble(melt(setDT(inputData), id.var = 'Dates', variable.name = 'Key', 
      value.name = 'Value')[, Key := paste0("Time", Key)])
...