2016-04-15 62 views
1

我有列表這樣的,更改列表的層次結構中的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生成後執行此操作。一些幫助PLZ。

+0

我發現從類似的問題解決在http://stackoverflow.com/questions/34643746/how-can-i-reshape-list-of-list-from-wide-to-long,thanks to any way,that will now me now now – TheRimalaya

回答

0

它可能不是很理想,但只要表結構是有規律的,你可以使用嵌套的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]) 
    } 
}