it-swarm.com.de

Wie kann ich eine Liste von Listen reduzieren?

Das tm -Paket erweitert c, sodass bei einer Menge von PlainTextDocuments automatisch ein Corpus erstellt wird. Leider muss anscheinend jedes PlainTextDocument separat angegeben werden.

z.B. Hätte ich:

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

Ich würde dies tun, um ein Corpus zu erhalten:

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

Ich habe eine Liste von Listen mit 'PlainTextDocument S, 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 Corpus zu bekommen, würde dies funktionieren:

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

Kann jemand einen einfacheren Weg vorschlagen, bitte?

ETA: foo<-unlist(foolist, recursive=FALSE) erzeugt eine flache Liste von PlainTextDocuments, was mich immer noch mit dem Problem belässt, eine Liste Element für Element an c zu übergeben.

59
dnagirl

Ich erwarte, dass unlist(foolist) Ihnen helfen wird. Es hat eine Option recursive, die standardmäßig TRUE ist.

Also gibt unlist(foolist, recursive = FALSE) die Liste der Dokumente zurück und Sie können sie folgendermaßen kombinieren:

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

do.call wendet die Funktion c nur auf die Elemente der erhaltenen Liste an

61
DrDom

Im Folgenden finden Sie eine allgemeinere Lösung für den Fall, dass Listen mehrfach verschachtelt sind und sich der Verschachtelungsgrad zwischen den Elementen der Listen unterscheidet:

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