2

我在使用列表时遇到了一些问题,而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() -> list.2[class(list.2)=="list"]

创建子集向量(到目前为止这似乎效果最好) -> subset_vector<-lapply(list.2, class)然后使用这个向量(加上一个序列)来挑选列表 -> list.2[[sequence[子集向量==“列表”]]]

但这一切似乎太复杂了,必须有一个更简单的解决方案吗?

在此先感谢您的帮助!

4

2 回答 2

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

这是你要找的吗?

于 2013-07-24T21:54:20.963 回答
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)
于 2013-07-24T22:29:51.880 回答