2013-02-09 14 views
5

Penso che questa sia una domanda per principianti, ma non sembra che abbia il vocabolario giusto per una ricerca Google efficace.Iterare su elenchi memorizzati in data.frame in R

Ho un data.frame, final, che contiene un elenco di clusters, ognuno dei quali è un elenco di stringhe.

Vorrei iterare l'elenco delle stringhe in ogni cluster: un ciclo all'interno di un ciclo for.

for (j in final$clusters){ 
    for (i in final$clusters$`j`){ 
     print final$clusters$`j`[i] 
    } 
} 

j corrisponde alle liste clusters, e i corrisponde agli elementi in clusters[j]

stavo cercando di farlo utilizzando la lunghezza di ogni cluster, che ho pensato che sarebbe stato qualcosa di simile length(final$clusters[1]), ma questo dà 1, non la lunghezza della lista.

Inoltre, final$clusters[1] dà $ '1', e nella riga successiva, tutte le stringhe in cluster 1.

Grazie.

EDIT: uscita del dput(str(final)), come richiesto:

List of 2 
$ clusters  :List of 1629 
    ..$ 1 : 
    ..$ 2 : 
    ..$ 3 : 
    ..$ 4 : 
    ..$ 5 : 
    ..$ 6 : 
    ..$ 7 : 
    ..$ 8 : 
    ..$ 9 : 
    ..$ 10 : 
    .. [list output truncated] 
$ cluster_stats: num [1:1629, 1:6] 0.7 0.7 0.7 0.7 0.7 0.7 ... 
    ..- attr(*, "dimnames")=List of 2 
    .. ..$ : chr [1:1629] "1" "2" "3" "4" ... 
    .. ..$ : chr [1:6] "min" "qu1" "median" "mean" ... 
NULL 

risposta

3

Credo che si confondono un list e uno data.frame. Immagino che il tuo finale sia l'oggetto è una lista.

per scorrere l'elenco È possibile utilizzare rapply. È una versione ricorsiva di lapply.

Ad esempio:

## I create some reproducible example 

clusters <- list(cluster1,cluster2) 
cluster1 <- list(a='a',b='b') 
cluster2 <- list(c='aaa',d='bbb') 
final <- list(clusters) 

Quindi, utilizzando rapply

rapply(final,f=print) 
[1] "a" 
[1] "b" 
[1] "aaa" 
[1] "bbb" 
    a  b  c  d 
    "a" "b" "aaa" "bbb" 

Aggiornamento dopo modifica di OP

Utilizzando lapply, ho ciclo attraverso il nome della lista. Per ogni nome, ottengo l'elenco degli elementi utilizzando [[ (è possibile utilizzare [ se si cerca di ottenere nomi e heder per i file), quindi si scrive il file utilizzando write.table. Qui utilizzo il nome dell'elemento nell'elenco per creare il nome del file. nel tuo caso si avrà il nome del file come numero. (1.txt, ...)

lapply(names(final$clusters), 
         function(x) 
          write.table(x=final$clusters[[x]], 
             file=paste(x,'.txt',sep=''))) 
+0

Quindi 'rapply' funziona come hai detto tu, per stampare l'elenco delle liste (grazie per i chiarimenti). Tuttavia, mi piacerebbe stampare solo uno degli elenchi alla volta (in realtà, speravo di usare 'sink' per stampare ognuno dei' cluster 'in un file diverso), ma non riesco a far funzionare 'print' , usando l'aiuto di @ pipo98 e il tuo: 'for (j in $ cluster finali) {rapply (finale $ cluster [j], f = print)}' restituisce molte righe di 'NULL'. – dd3

+0

@ dd3 non è necessario combinare 'rapply' con' for'. 'Rapply' andrà in modo incongruo attraverso la lista per ottenere le foglie .. puoi dput dput il' dput (str (final)) 'e aggiungerlo alla tua domanda ... – agstudy

+0

il problema è che voglio solo farlo per uno delle sottoliste alla volta. Nel tuo esempio, mi piacerebbe ottenere solo l'output di 'cluster1', scriverlo in un file e poi fare lo stesso per gli altri cluster, ognuno dei quali scrive su un file diverso. Ho aggiunto l'output richiesto alla mia domanda. Grazie per l'aiuto. – dd3

4

Penso che il problema principale è che il modo di eseguire iterazioni qui è sbagliato.

Penso che qualcosa di simile potrebbe funzionare meglio:

for (j in final$clusters){ 
    for (i in final$clusters[j]){ 
     print i 
    } 
} 

Ecco la documentazione per i loop: http://manuals.bioinformatics.ucr.edu/home/programming-in-r#TOC-For-Loop per sottoinsiemi: http://www.statmethods.net/management/subset.html

buona fortuna

+0

Grazie per la cattura di questo! Tuttavia, non risolve interamente il mio problema. (Eviterei la tua risposta, ma non ho la reputazione di farlo.) – dd3

Problemi correlati