Создайте список TimeSeries из кадра данных - PullRequest
0 голосов
/ 19 мая 2018

У меня есть кадр данных, который выглядит следующим образом:

# A tibble: 6 x 4
# Groups:   IND_LOC [1]
  year_month    total_this_month mean_this_month IND_LOC
  <S3: yearmon>            <dbl>           <dbl> <fct>  
1 Jan 2013              3960268.         360024. 8_9    
2 Feb 2013              3051909.         277446. 8_9    
3 Mar 2013              3504636.         318603. 8_9    
4 Apr 2013              3234451.         294041. 8_9    
5 May 2013              3409146.         284096. 8_9    
6 Jun 2013              3619219.         301602. 8_9 

В последнем столбце IND_LOC есть 89 уникальных значений (1_1, 1_2 ... 8_9)

Я хотел бысоздать список временных рядов, соответствующих этим значениям 'IND_LOC', чтобы он имел следующую структуру (это всего лишь пример с другим набором данных, заменяя '$ 1_1' на '$ Germany' и т. д.):

> str(time_series)
List of 9
 $ Germany    : Time-Series [1:52] from 1960 to 2011: 684721 716424 749838   ...
 $ Singapore  : Time-Series [1:52] from 1960 to 2011: 7208 7795 8349   ...
 $ Finland    : Time-Series [1:37] from 1975 to 2011: 85842 86137 86344   ...

Любая помощь в этом с благодарностью!

Ответы [ 2 ]

0 голосов
/ 19 мая 2018

Другой вариант, используя split и lapply;и используя zoo в качестве помощника для преобразования в ts.

dat <- read.csv(text="year_month,total_this_month,mean_this_month,IND_LOC
Jan 2013,3960268,360024,8_9
Feb 2013,3051909,277446,8_9
Mar 2013,3504636,318603,8_9
Apr 2013,3234451,294041,8_9
May 2013,3409146,284096,8_9
Jun 2013,3619219,301602,8_9
Jan 2013,3960268,360024,9_9
Feb 2013,3051909,277446,9_9
Mar 2013,3504636,318603,9_9
Apr 2013,3234451,294041,9_9
May 2013,3409146,284096,9_9
Jun 2013,3619219,301602,9_9")
dat$year_month <- as.yearmon(dat$year_month)

library(zoo)
time_series <- lapply(split(dat, dat$IND_LOC),
  function(x) as.ts(zoo(x$total_this_month, x$year_month)))
str(time_series)
# List of 2
#   $ 8_9: Time-Series [1:6] from 1 to 6: 3234451 3051909 3960268 3619219 3504636
#   $ 9_9: Time-Series [1:6] from 1 to 6: 3234451 3051909 3960268 3619219 3504636
sapply(time_series, frequency)
# 8_9 9_9
#  12  12
0 голосов
/ 19 мая 2018

Мы могли бы сделать группу и summarise

library(dplyr)
library(lubridate)
df %>%
  group_by(IND_LOC) %>%
  summarise(time_series = list(ts(total_this_month, 
       start= c(year(year_month[1]), month(year_month[1])), frequency = 12)))  
...