按月订购动物园对象 - 按顺序

时间:2017-08-06 09:03:27

标签: r zoo

我的数据框如下所示:

month        SYMBOL val1 val2 val3  
Jan/2017        A   3   4   6  
Feb/2017        A   1   2   4  
Mar/2017        A   2   5   3  
Apr/2017        A   4   3   6  
May/2017        A   6   2   8  
Jan/2017        B   7   3   1  
Feb/2017        B   3   7   3  
Mar/2017        B   1   3   6  
Apr/2017        B   7   2   8  
May/2017        B   9   7   2  
Jan/2017        C   0   8   6  
Feb/2017        C   1   3   9  
Mar/2017        C   3   3   1  
Apr/2017        C   4   1   5  
May/2017        C   6   7   1  

当我将它转换为以yearmon作为索引的zoo对象时,SYMBOLS列会改变如下:

    SYMBOL val1 val2 val3  
Jan/2017    A   3   4   6  
Jan/2017    B   7   3   1    
Jan/2017    C   0   8   6  
Feb/2017    A   1   2   4  
Feb/2017    B   3   7   3  
Feb/2017    C   1   3   9  
Mar/2017    A   2   5   3  
Mar/2017    B   1   3   6       
Mar/2017    C   3   3   1   
Apr/2017    A   4   3   6     
Apr/2017    B   7   2   8     
Apr/2017    C   6   2   8     
May/2017    A   9   7   2  
May/2017    B   4   1   5   
May/2017    C   6   7   1  

有没有办法在创建zoo对象时按顺序排序年份,以便SYMBOLS保持为AAA,BBB,CCC而不是变形? zoo不可避免地将它改为JAN JAN JAN FEB FEB FEB而不是JAN - MAY,符号A,JAN - MAY为符号B等等。

1 个答案:

答案 0 :(得分:1)

动物园对象是时间序列,特别是时间序列有序观察。如果你想表示一个不是时间序列的对象,那么要么不使用zoo,要么以某种方式将它重新编写为时间序列。

1)多变量时间序列虽然所呈现的数据(请参阅下面的注释中的Lines)不是时间序列,但可以通过将其拆分来表示为多变量时间序列第二个输入栏:

library(zoo)
z <- read.zoo(text = Lines, split = 2, FUN = as.yearmon, format = "%b/%Y", header = TRUE)

,并提供:

> z
         val1.A val2.A val3.A val1.B val2.B val3.B val1.C val2.C val3.C
Jan 2017      3      4      6      7      3      1      0      8      6
Feb 2017      1      2      4      3      7      3      1      3      9
Mar 2017      2      5      3      1      3      6      3      3      1
Apr 2017      4      3      6      7      2      8      4      1      5
May 2017      6      2      8      9      7      2      6      7      1

2)按多个时间序列列表或者,也可以将其表示为动物园对象的by列表:

DF <- read.table(text = Lines, header = TRUE)
byz <- by(DF[-2], DF[2], function(x) read.zoo(x, FUN = as.yearmon, format = "%b/%Y"))

,并提供:

> byz
SYMBOL: A
         val1 val2 val3
Jan 2017    3    4    6
Feb 2017    1    2    4
Mar 2017    2    5    3
Apr 2017    4    3    6
May 2017    6    2    8
------------------------------------------------------------ 
SYMBOL: B
         val1 val2 val3
Jan 2017    7    3    1
Feb 2017    3    7    3
Mar 2017    1    3    6
Apr 2017    7    2    8
May 2017    9    7    2
------------------------------------------------------------ 
SYMBOL: C
         val1 val2 val3
Jan 2017    0    8    6
Feb 2017    1    3    9
Mar 2017    3    3    1
Apr 2017    4    1    5
May 2017    6    7    1

3)合成索引操作这样的对象可能很困难但是要涵盖所有可能从SYMBOL和month列合成新索引以创建带有字符索引的动物园系列的可能性像这样。

myindex <- function(sym, mon) paste(sym, format(as.yearmon(mon, "%b/%Y"), "%Y-%m"))
z2 <- read.zoo(text = Lines, index = 2:1, FUN = myindex, header = TRUE)

给出以下zoo对象:

> z2
          val1 val2 val3
A 2017-01    3    4    6
A 2017-02    1    2    4
A 2017-03    2    5    3
A 2017-04    4    3    6
A 2017-05    6    2    8
B 2017-01    7    3    1
B 2017-02    3    7    3
B 2017-03    1    3    6
B 2017-04    7    2    8
B 2017-05    9    7    2
C 2017-01    0    8    6
C 2017-02    1    3    9
C 2017-03    3    3    1
C 2017-04    4    1    5
C 2017-05    6    7    1

注意:可重复形式的输入是:

Lines <- "month SYMBOL val1 val2 val3
Jan/2017 A 3 4 6
Feb/2017 A 1 2 4
Mar/2017 A 2 5 3
Apr/2017 A 4 3 6
May/2017 A 6 2 8
Jan/2017 B 7 3 1
Feb/2017 B 3 7 3
Mar/2017 B 1 3 6
Apr/2017 B 7 2 8
May/2017 B 9 7 2
Jan/2017 C 0 8 6
Feb/2017 C 1 3 9
Mar/2017 C 3 3 1
Apr/2017 C 4 1 5
May/2017 C 6 7 1"