90 votes

Comment aplatir une liste de listes ?

En tm Le paquet s'étend c de sorte que, si l'on donne un ensemble de PlainTextDocument il crée automatiquement un Corpus . Malheureusement, il semble que chaque PlainTextDocument doit être spécifié séparément.

par exemple, si j'avais :

foolist <- list(a, b, c); # where a,b,c are PlainTextDocument objects

Je ferais ça pour avoir un Corpus :

foocorpus <- c(foolist[[1]], foolist[[2]], foolist[[3]]);

J'ai une liste de listes de 'PlainTextDocument qui ressemble à ceci :

> str(sectioned)
List of 154
 $ :List of 6
  ..$ :Classes 'PlainTextDocument', 'TextDocument', 'character'  atomic [1:1] Developing assessment models   Developing models
  .. .. ..- attr(*, "Author")= chr "John Smith"
  .. .. ..- attr(*, "DateTimeStamp")= POSIXlt[1:1], format: "2013-04-30 12:03:49"
  .. .. ..- attr(*, "Description")= chr(0) 
  .. .. ..- attr(*, "Heading")= chr "Research Focus"
  .. .. ..- attr(*, "ID")= chr(0) 
  .. .. ..- attr(*, "Language")= chr(0) 
  .. .. ..- attr(*, "LocalMetaData")=List of 4
  .. .. .. ..$ foo           : chr "bar"
  .. .. .. ..$ classification: chr "Technician"
  .. .. .. ..$ team          : chr ""
  .. .. .. ..$ supervisor    : chr "Bill Jones"
  .. .. ..- attr(*, "Origin")= chr "Smith-John_e.txt"

#etc., all sublists have 6 elements

Donc, pour obtenir tous mes PlainTextDocument dans un Corpus cela pourrait fonctionner :

sectioned.Corpus <- c(sectioned[[1]][[1]], sectioned[[1]][[2]], ..., sectioned[[154]][[6]])

Quelqu'un peut-il suggérer un moyen plus facile, s'il vous plaît ?

ETA : foo<-unlist(foolist, recursive=FALSE) produit une liste plate de PlainTextDocuments, ce qui me laisse toujours avec le problème de fournir une liste élément par élément à c

108voto

DrDom Points 2709

Je m'attends à ce que unlist(foolist) vous aidera. Il y a une option recursive qui est TRUE par défaut.

Así que unlist(foolist, recursive = FALSE) vous renverra la liste des documents, et vous pourrez ensuite les combiner par :

do.call(c, unlist(foolist, recursive=FALSE))

do.call applique simplement la fonction c aux éléments de la liste obtenue

33voto

Michael Points 1466

Voici une solution plus générale pour les cas où les listes sont imbriquées plusieurs fois et où le degré d'imbrication diffère entre les éléments des listes :

 flattenlist <- function(x){  
  morelists <- sapply(x, function(xprime) class(xprime)[1]=="list")
  out <- c(x[!morelists], unlist(x[morelists], recursive=FALSE))
  if(sum(morelists)){ 
    Recall(out)
  }else{
    return(out)
  }
}

12voto

Zeus Points 468

Voici une autre méthode qui a fonctionné pour ma liste de listes.

df <- as.data.frame(do.call(rbind, lapply(foolist, as.data.frame)))

Ou regardez les nouvelles fonctions de tidyr qui fonctionnent bien.

Rectangle une liste imbriquée dans un tibble ordonné

rectangulaire

    lst <-  list(
      list(
        age = 23,
        gender = "Male",
        city = "Sydney"
      ),
      list(
        age = 21,
        gender = "Female",
        city = "Cairns"
      )
    )

    tib <- tibble(lst)  %>% 
      unnest_wider(lst)

df <- as.data.frame(tib)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X