2013-04-30 23 views
34

Il pacchetto tm estende c in modo che, se viene fornito un set di PlainTextDocument s, venga creato automaticamente un Corpus. Sfortunatamente, sembra che ogni PlainTextDocument debba essere specificato separatamente.come appiattire un elenco di elenchi in R

ad es. se avessi:

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

farei questo per ottenere un Corpus:

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

Ho una lista di liste di 'PlainTextDocument s che assomiglia a questo:

> 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 

Così , per ottenere tutti i miei PlainTextDocument s in un Corpus, questo funzionerebbe:

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

Qualcuno può suggerire un modo più semplice, per favore?

ETA: foo<-unlist(foolist, recursive=FALSE) produce una semplice lista di PlainTextDocuments, il che mi lascia ancora con il problema di alimentare un elemento di lista per elemento di c

risposta

46

Mi aspetto che unlist(foolist) vi aiuterà. Ha un'opzione recursive che è TRUE per impostazione predefinita. Quindi non elencati (foolist, recursive = FALSE) restituirà l'elenco dei documenti, e quindi è possibile combinare da

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

do.call applica solo la funzione c agli elementi della lista ottenuta

3

Ecco un soluzione più generale quando le liste sono annidati più volte e la quantità di nidificazione differisce tra elementi delle liste:

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

solo per fare questo un po 'più comprensibile io solo sottolineare che le liste identificano usando la classe (xprime) [ 1] == "elenco") è necessario (piuttosto che usare is.list) quando gli oggetti nidificati sono di classi che ereditano da elenchi (ad es. nota che is.list (data.frame (3)) restituisce TRUE) – Michael

+0

nota anche che questo non mantiene l'ordine della struttura originale – Michael

Problemi correlati