Вложить объект временных рядов в DataFrame

library(fpp)
library(purrr)
library(tidyr)

data(austourists)
tr <- window(austourists,end=c(2007,12))
te <- window(austourists, start=c(2008,1))

У меня есть данные об австралийских туристах из пакета FPP. Я хотел бы создать несколько объектов временных рядов, которые будут обрезаны по разным начальным годам.

df <- as.data.frame(1999:2005)
colnames(df) <- "yr_start"
df$yr_end <- 2008

Я хотел бы повторить оконную функцию, как показано выше, но с данными входами в df. Я пытался использовать map и nest для создания объекта таймсерии и размещения его на месте.

Я стремлюсь к фреймворку со структурой

   head(df)
 yr_start yr_end  ts.object 
 <num>    <num>    <list>
 1992     2008     <S3 class: ts object>
 1993     2008     <S3 class: ts object>
 1994     2008    <S3 class: ts object>
 1995     2008    <S3 class: ts object>
 1996     2008    <S3 class: ts object>
 1997     2008    <S3 class: ts object>

Цель состоит в том, чтобы использовать эти ts-объекты позже для запуска моделей экспоненциального сглаживания с использованием функции карты для этих ts-объектов.


person msubbaiah    schedule 02.11.2017    source источник


Ответы (1)


Вы можете использовать map2 над yr_start и yr_end столбцами и построить ts объект для каждой пары start-end лет:

df %>% 
    mutate(ts.object = map2(yr_start, yr_end, ~ window(austourists, start=c(.x, 1), end=c(.y, 4)))) %>% 
    as.tibble()

# A tibble: 7 x 3
#  yr_start yr_end ts.object
#     <int>  <dbl>    <list>
#1     1999   2008  <S3: ts>
#2     2000   2008  <S3: ts>
#3     2001   2008  <S3: ts>
#4     2002   2008  <S3: ts>
#5     2003   2008  <S3: ts>
#6     2004   2008  <S3: ts>
#7     2005   2008  <S3: ts>

df_ts <- df %>% 
    mutate(ts.object = map2(yr_start, yr_end, ~ window(austourists, start=c(.x, 1), end=c(.y, 4)))) %>% 
    as.tibble()

Вот две последние строки в столбце ts.object:

df_ts$ts.object[[6]]
#         Qtr1     Qtr2     Qtr3     Qtr4
#2004 41.27360 26.65586 28.27986 35.19115
#2005 41.72746 24.04185 32.32810 37.32871
#2006 46.21315 29.34633 36.48291 42.97772
#2007 48.90152 31.18022 37.71788 40.42021
#2008 51.20686 31.88723 40.97826 43.77249

df_ts$ts.object[[7]]
#         Qtr1     Qtr2     Qtr3     Qtr4
#2005 41.72746 24.04185 32.32810 37.32871
#2006 46.21315 29.34633 36.48291 42.97772
#2007 48.90152 31.18022 37.71788 40.42021
#2008 51.20686 31.88723 40.97826 43.77249

Или используйте Map из базы R:

df %>% mutate(ts.object = Map(function(x, y) window(austourists, start=c(x, 1), end=c(y, 4)), yr_start, yr_end))
person Psidom    schedule 02.11.2017
comment
Ах прекрасно. Я играл с функцией map2, но не знал, как их вложить. Спасибо, это работает, как ожидалось! - person msubbaiah; 02.11.2017