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

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


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

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.