【问题标题】:Extract xts objects from lists and sub-lists从列表和子列表中提取 xts 对象
【发布时间】:2013-07-24 14:03:57
【问题描述】:

我在使用列表时遇到了一些问题,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 然后使用这个向量(加上一个序列)来挑选列表 -> list.2[[sequence[subset_vector=="list"]]]

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

提前感谢您的帮助!

【问题讨论】:

  • 这是一个很好的第一个问题。让他们来吧,Ben K!

标签: r list xts sublist


【解决方案1】:
c(list.2[sapply(list.2, is.xts)], unlist(list.2[!sapply(list.2, is.xts)], recursive=F))

这是你要找的吗?

【讨论】:

    【解决方案2】:

    你可以这样写一个递归函数:

    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)
    

    【讨论】:

    • 感谢您的回答。我决定使用 Dans 的建议,因为我已经在我的代码中运行了许多循环。不过也很好用,干杯
    猜你喜欢
    • 2014-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-05
    • 2015-02-14
    • 2020-11-15
    • 2023-01-10
    相关资源
    最近更新 更多