1

我想询问有关将数据框(或 tibble)转换为 tsibble 的最有效方法的建议。

数据框在第一列中有日期,所有其他列代表各种时间序列,并在相应日期给出值。我想有效地创建一个 tsibble,其中键 = 每个时间序列的名称,索引 = 每个日期。

所以输出将是一个 tsibble,如下所示:

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

3 回答 3

3

您可以使用以下方法转换为“长格式” 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")
于 2020-01-05T20:59:32.363 回答
1

我们可以使用meltfromdata.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)])
于 2020-01-05T20:36:10.217 回答
1

转换为 zoo,然后转换为长数据帧,最后转换为 tsibble

library(tsibble)
library(zoo)

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

或使用stack(或任何其他重塑功能,包括重塑、融化、聚集、pivot_longer)来创建一个长数据帧,然后到 tsibble。如果高效意味着最少的先决条件,那么这只使用 tsibble 包及其依赖项。

library(tsibble)

inputData %>%
  { cbind(.[1], stack(.[-1])) } %>%
  as_tsibble(key = "ind", index = "Dates")
于 2020-01-05T20:52:43.927 回答