Wie kann ich eine Liste von Listen reduzieren?

72

Das tmPaket wird cso erweitert , dass bei Angabe eines Satzes von PlainTextDocuments automatisch ein erstellt wird Corpus. Leider scheint es, dass jeder PlainTextDocumentseparat angegeben werden muss.

zB wenn ich hätte:

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

Ich würde das tun, um ein Corpus:

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

Ich habe eine Liste von Listen von 'PlainTextDocuments, die so aussieht:

> 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

Also, um alle meine PlainTextDocuments in ein zu bekommen Corpus, würde dies funktionieren:

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

Kann jemand bitte einen einfacheren Weg vorschlagen?

ETA: foo<-unlist(foolist, recursive=FALSE)Erstellt eine flache Liste von PlainTextDocuments, wodurch ich immer noch das Problem habe, eine Liste Element für Element zuzuführenc

dnagirl
quelle

Antworten:

76

Ich gehe davon aus, dass unlist(foolist)Ihnen das helfen wird. Es hat eine Option, recursivedie TRUEstandardmäßig ist.

So unlist(foolist, recursive = FALSE)wird die Liste der Dokumente zurückgegeben, und dann können Sie sie kombinieren durch:

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

do.callWendet die Funktion nur cauf die Elemente der erhaltenen Liste an

DrDom
quelle
1
NCmisc::Unlist()Erwägen Sie auch die Verwendung für die Auflistung über die erste Ebene hinaus.
Megatron
25

Hier ist eine allgemeinere Lösung für den Fall, dass Listen mehrmals verschachtelt sind und das Ausmaß der Verschachtelung zwischen den Elementen der Listen unterschiedlich ist:

 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)
  }
}
Michael
quelle
3
Um dies ein wenig verständlicher zu machen, möchte ich nur darauf hinweisen, dass das Identifizieren von Listen mit class (xprime) [1] == "list") erforderlich ist (anstatt is.list zu verwenden), wenn Ihre verschachtelten Objekte von Klassen stammen, die erben aus Listen (dh beachten Sie, dass is.list (data.frame (3)) zu TRUE ausgewertet wird)
Michael
2
Beachten Sie auch, dass dies nicht die Reihenfolge der ursprünglichen Struktur
Michael
Michael, wie würdest du vorgehen, um die Ordnung der ursprünglichen Struktur beizubehalten?
Mihai
1

Hier ist eine andere Methode, die für meine Liste von Listen funktioniert hat.

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

Zeus
quelle