如果我有一个动物园对象列表,我如何通过列表索引([[]])和日期来引用特定值?例如:
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)]
我知道这在结构上是不正确的;但这就是我在查看数据结构的方式。任何帮助都会很棒......
答案 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)]