2016-04-15 1 views
1

Je liste comme ça,changer la hiérarchie d'une liste dans 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) 

La structure est,

> 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" 

Je veux restructurer ce après avoir myList afin que chaque color volonté vient avant cut. Je ne peux pas changer le code qui crée myList. Je dois le faire après myList est généré. Un peu d'aide plz.

+0

J'ai trouvé la solution d'une question similaire à http://stackoverflow.com/questions/34643746/how-can-je-reshape-a-list-of-list-from-wide-to-long, merci de toute façon, ça m'aidera pour le moment – TheRimalaya

Répondre

0

Il pourrait ne pas être idéal, mais aussi longtemps que la structure de la liste est régulière, vous pouvez utiliser une boucle imbriquée pour:

# 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]) 
    } 
}