索引到动物园对象列表

时间:2013-08-05 22:21:33

标签: r time-series zoo

如果我有一个动物园对象列表,我如何通过列表索引([[]])和日期来引用特定值?例如:

require("zoo")
require("tseries")
require("lubridate")

z = zoo(c(1,2,3), as.Date(c("2000/1/1", "2000/2/1", "2000/3/1")))
z1 = zoo(c(1,2,3), as.Date(c("2000/1/1", "2000/2/1", "2000/3/1")))
z2 = zoo(c(10,20,30), as.Date(c("2000/1/1", "2000/2/1", "2000/3/1")))
z3 = zoo(c(100,200,300), as.Date(c("2000/1/1", "2000/2/1", "2000/3/1")))
> l = list(z1,z2,z3)
> l
[[1]]
2000-01-01 2000-02-01 2000-03-01 
         1          2          3 

[[2]]
2000-01-01 2000-02-01 2000-03-01 
        10         20         30 

[[3]]
2000-01-01 2000-02-01 2000-03-01 
       100        200        300 

我的目标是为索引中包含月份列号的每一行返回一个值。上述数据的期望输出将是:

1, 20, 300(可以是动物园对象,矢量,最简单的显示)。我会强迫它如何需要。

我一直在尝试编码的方式是(其中包括):

monthNumbs = month(index(l[[1]]))
l[[monthNumbs]][index(l)]

我知道这在结构上是不正确的;但这就是我在查看数据结构的方式。任何帮助都会很棒......

1 个答案:

答案 0 :(得分:3)

如果我很好理解你的问题,我认为你可以这样做:

## loop through the index of the list
## for each zoo object l[[x]]  you get months index
## and you compare it to current index
unlist(lapply(seq_along(l),
        function(x)l[[x]][month(index(l[[x]]))==x]))
[1]   1  20 300

编辑使用xts包的另一种选择:

如果所有zoo个对象都有相同的索引,则可以合并它们以获得矩阵结构:

library(xts)
mm <- do.call(merge,lapply(l,as.xts))
           c.1..2..3. c.10..20..30. c.100..200..300.
2000-01-01          1            10              100
2000-02-01          2            20              200
2000-03-01          3            30              300

然后你得到像这样的diagonales值:

as.matrix(mm)[col(mm)==row(mm)]