1

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

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)]

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

4

1 回答 1

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

然后你得到这样的对角线值:

as.matrix(mm)[col(mm)==row(mm)]
于 2013-08-05T23:00:16.523 回答