我的数据框如下所示:
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等等。
答案 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"