将数据帧(或 tibble)转换为 tsibble 的有效方法
Efficient approach(es) to convert a dataframe (or tibble) into a tsibble
我想询问有关将数据帧(或 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))
我们可以使用 data.table
中的 melt
高效地执行此操作,然后将其转换为 tibble
library(data.table)
library(tibble)
as_tibble(melt(setDT(inputData), id.var = 'Dates', variable.name = 'Key',
value.name = 'Value')[, Key := paste0("Time", Key)])
转换为 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")
您可以使用 tidyr
:
转换为 "long format"
tsibble_input <- tidyr::pivot_longer(inputData, cols = -Dates, names_to = "Key", values_to = "Value")
并得到 tsibble
:
tsibble::as_tsibble(tsibble_input, index = "Dates", key = "Key")
我想询问有关将数据帧(或 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))
我们可以使用 data.table
中的 melt
高效地执行此操作,然后将其转换为 tibble
library(data.table)
library(tibble)
as_tibble(melt(setDT(inputData), id.var = 'Dates', variable.name = 'Key',
value.name = 'Value')[, Key := paste0("Time", Key)])
转换为 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")
您可以使用 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")