Изменить иерархию списка в R

У меня есть такой список,

myList <- lapply(unique(diamonds$cut), function(x){
    lst <- lapply(unique(diamonds$color), function(y){
        dta <- diamonds[diamonds$cut == x & diamonds$color == y, ]
        lm(price ~ carat, data = dta)
    })
    names(lst) <- unique(diamonds$color)
    return(lst)
})
names(myList) <- unique(diamonds$cut)

Структура есть,

> str(myList, max.level=2)
List of 5
 $ Ideal    :List of 7
  ..$ E:List of 12
  .. ..- attr(*, "class")= chr "lm"
  ..$ I:List of 12
  .. ..- attr(*, "class")= chr "lm"
  ..$ J:List of 12
  .. ..- attr(*, "class")= chr "lm"
  ..$ H:List of 12
  .. ..- attr(*, "class")= chr "lm"
  ..$ F:List of 12
  .. ..- attr(*, "class")= chr "lm"
  ..$ G:List of 12
  .. ..- attr(*, "class")= chr "lm"
  ..$ D:List of 12
  .. ..- attr(*, "class")= chr "lm"
 $ Premium  :List of 7
  ..$ E:List of 12
  .. ..- attr(*, "class")= chr "lm"
  ..$ I:List of 12
  .. ..- attr(*, "class")= chr "lm"
  ..$ J:List of 12
  .. ..- attr(*, "class")= chr "lm"
  ..$ H:List of 12
  .. ..- attr(*, "class")= chr "lm"
  ..$ F:List of 12
  .. ..- attr(*, "class")= chr "lm"
  ..$ G:List of 12
  .. ..- attr(*, "class")= chr "lm"
  ..$ D:List of 12
  .. ..- attr(*, "class")= chr "lm"
 $ Good     :List of 7
  ..$ E:List of 12
  .. ..- attr(*, "class")= chr "lm"
  ..$ I:List of 12
  .. ..- attr(*, "class")= chr "lm"
  ..$ J:List of 12
  .. ..- attr(*, "class")= chr "lm"
  ..$ H:List of 12
  .. ..- attr(*, "class")= chr "lm"
  ..$ F:List of 12
  .. ..- attr(*, "class")= chr "lm"
  ..$ G:List of 12
  .. ..- attr(*, "class")= chr "lm"
  ..$ D:List of 12
  .. ..- attr(*, "class")= chr "lm"
 $ Very Good:List of 7
  ..$ E:List of 12
  .. ..- attr(*, "class")= chr "lm"
  ..$ I:List of 12
  .. ..- attr(*, "class")= chr "lm"
  ..$ J:List of 12
  .. ..- attr(*, "class")= chr "lm"
  ..$ H:List of 12
  .. ..- attr(*, "class")= chr "lm"
  ..$ F:List of 12
  .. ..- attr(*, "class")= chr "lm"
  ..$ G:List of 12
  .. ..- attr(*, "class")= chr "lm"
  ..$ D:List of 12
  .. ..- attr(*, "class")= chr "lm"
 $ Fair     :List of 7
  ..$ E:List of 12
  .. ..- attr(*, "class")= chr "lm"
  ..$ I:List of 12
  .. ..- attr(*, "class")= chr "lm"
  ..$ J:List of 12
  .. ..- attr(*, "class")= chr "lm"
  ..$ H:List of 12
  .. ..- attr(*, "class")= chr "lm"
  ..$ F:List of 12
  .. ..- attr(*, "class")= chr "lm"
  ..$ G:List of 12
  .. ..- attr(*, "class")= chr "lm"
  ..$ D:List of 12
  .. ..- attr(*, "class")= chr "lm"

Я хочу реструктурировать это после того, как myList так что каждый color воля приходит раньше cut, Я не могу изменить код, который создает myList, Я должен сделать это после myList генерируется. Некоторая помощь плз.

1 ответ

Это может быть не идеально, но пока структура списка регулярна, вы можете использовать вложенный цикл for:

# get names of inner and outer lists
innerNames <- names(myList[[1]])
outerNames <- names(myList)

# creat new blank list
myList2 <- list()

# restructure
for(i in innerNames) {
  for(j in outerNames)
    if(j == outerNames[1]) myList2[[i]] <- myList[[j]][i]
    else myList2[[i]] <- c(myList2[[i]], myList[[j]][i])
  }
}
Другие вопросы по тегам