从列表和子列表中提取xts对象

时间:2013-07-24 21:29:18

标签: r list xts sublist

我在使用列表方面遇到了一些问题, unlist()似乎没有删除它。

问题在于:我使用 lapply()在列表上执行函数。此函数按特定条件拆分xts对象,因此它返回两个xts对象的列表。生成的 lapply()列表包含多个子列表(在我的示例中:输出看起来很像 list.2

示例:

library(xts)

#create three dummy xts objects
a<-c(1:10)
b<-c(2:5)
c<-c(6:9)

a.by<-as.POSIXct(a, tz="GMT", origin="1990-01-01 00:00:00")
b.by<-as.POSIXct(b, tz="GMT", origin="1990-01-01 00:00:00")
c.by<-as.POSIXct(c, tz="GMT", origin="1990-01-01 00:00:00")

xts.a<-xts(a, order.by=a.by)
xts.b<-xts(b, order.by=b.by)
xts.c<-xts(c, order.by=c.by)

# creating first list of objects a & b. this is passed to my function

list.1<-list(xts.a, xts.b)

# creating second list of objects a & b, c. this is similar to my output

list.2<-list(list.1, xts.c)

目标:我想将这些xts对象传递给更多功能。我需要主列表和所有子列表中所有xts对象的列表。在我的例子中,我想要 list(xts.a,xts.b,xts.c)。我想将子列表分组,打破它和主列表并重新使用部分(xts对象)。

问题:由于数据加载,我试图自动执行此操作,而不仅仅是上面的问题。所以对于多个子列表而不是特定的顺序,或列表中只有三个对象。

思想: 我尝试过使用 class() - &gt; list.2 [类(list.2)== “列表”]

创建子集向量(到目前为止似乎效果最好) - &gt; subset_vector&lt; -lapply(list.2,class)然后使用此向量(加上序列)来挑选列表 - &gt;的 list.2 [[序列[subset_vector == “列表”]]]

但这一切看起来都太复杂了,必须有一个更简单的解决方案吗?

提前感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

c(list.2[sapply(list.2, is.xts)], unlist(list.2[!sapply(list.2, is.xts)], recursive=F))

这是你在找什么?

答案 1 :(得分:1)

您可以编写这样的递归函数:

LL <- vector('list')
rapply2 <- function(x) {
 for(i in seq_along(x)) {
    if (is.xts(x[[i]])) 
      LL <<- append(LL,list(x[[i]]))
     else rapply2(x[[i]])
  }
}

然后

rapply2(list.2)