我在使用列表方面遇到了一些问题, 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 == “列表”]]]
但这一切看起来都太复杂了,必须有一个更简单的解决方案吗?
提前感谢您的帮助!
本
答案 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)