Извлечь объекты xts из списков и подсписок

У меня проблемы со списками, и 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 [[последовательность [subset_vector == "list"]]]

Но все это кажется слишком сложным, должно быть более простое решение?

Заранее спасибо за помощь!

Бен


person Ben K    schedule 24.07.2013    source источник
comment
Это отличный первый вопрос. Держи их, Бен К.   -  person Jesse Smith    schedule 25.07.2013


Ответы (2)


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

Это то, что ты искал?

person Doctor Dan    schedule 24.07.2013

Вы можете написать такую ​​рекурсивную функцию:

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)
person agstudy    schedule 24.07.2013
comment
Спасибо за ответ. Я решил использовать предложение Данса, так как я уже использую множество циклов в своем коде. Хотя тоже отлично работает, ура - person Ben K; 25.07.2013