【问题标题】:Ordering zoo object by months - sequentially按月订购动物园对象 - 顺序
【发布时间】:2017-08-06 09:03:26
【问题描述】:

我的数据框如下所示:

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 而不是符号 A 的 JAN - MAY,符号 B 的 JAN - MAY 等等。

【问题讨论】:

  • 你的代码是什么?

标签: r zoo


【解决方案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 和月份列合成新索引以创建具有字符索引的动物园系列像这样。

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)

给出以下动物园对象:

> 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"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-14
    • 2012-02-27
    • 2015-03-23
    • 2019-07-14
    • 2018-03-04
    • 2023-01-23
    • 2011-11-10
    • 2012-02-27
    相关资源
    最近更新 更多