2013-08-05 55 views
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)] 

我知道这是不正确结构;但这是我查看数据结构的方式。任何帮助将是巨大的......

+0

我不明白你怎么弄'1,20,30',你的意思是'1,20,300'。你能澄清一下吗? – agstudy

+0

是的!编辑,thx。 – StatsViaCsh

+0

你所有的动物园对象是否有相同的索引? – agstudy

回答

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

非常酷,谢谢。 – StatsViaCsh