2013-02-09 16 views
5

Wydaje mi się, że jest to pytanie początkujące, ale wydaje mi się, że nie dysponuję odpowiednim słownictwem do skutecznego wyszukiwania w Google.Powtarzanie list przechowywanych w data.frame w R

Mam data.frame, final, która zawiera listę clusters, z których każda jest listą ciągów.

Chciałbym iterować nad listą ciągów w każdym klastrze: pętla for wewnątrz pętli for.

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

j odpowiada na listy w clusters i i odpowiada pozycji w clusters[j]

starałem się to zrobić za pomocą długość każdego klastra, co myślałem że będzie coś length(final$clusters[1]), ale to daje 1, a nie długość listy.

Również final$clusters[1] daje $ '1', a w następnej linii, wszystkie ciągi w klastrze 1.

Dzięki.

EDIT: wyjście dput(str(final)), zgodnie z wnioskiem:

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 

Odpowiedz

3

Chyba mylić list i data.frame. Domyślam się, że twój finał to obiekt to lista.

Aby powtórzyć listę, można użyć rapply. Jest to rekurencyjna wersja lapply.

Na przykład:

## I create some reproducible example 

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

Więc za pomocą rapply

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

Aktualizacja po edycji przez OP

Korzystanie lapply, I pętli nazwą listy. Dla każdej nazwy otrzymuję listę elementów za pomocą [[ (możesz użyć [, jeśli używasz różdżki, aby uzyskać nazwy i pliki do pobrania), a następnie piszę ten plik, używając write.table. Tutaj używam nazwy elementu na liście, aby utworzyć nazwę pliku. w twoim przypadku będziesz miał nazwę pliku jako numer. (1.txt, ...)

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

Tak więc 'rapply' działa tak, jak pan stwierdził, aby wydrukować listę list (dzięki za wyjaśnienie). Chciałbym jednak wydrukować tylko jedną z list na raz (w rzeczywistości miałem nadzieję użyć 'sink', aby wydrukować każdy z' clusterów 'do innego pliku), ale nie mogę uruchomić 'print' do pracy , używając pomocy @ pipo98 i twojej: 'dla (j w końcowych klastrach $) {rapply (końcowe $ clusters [j], f = print)}' zwraca wiele wierszy 'NULL'. – dd3

+0

@ dd3 nie trzeba łączyć "rapply" z 'for'. 'Rapply' przejdzie recusrivly poprzez listę, aby uzyskać liście ... czy możesz przesłać dput' dput (str (final)) i dodać go do swojego pytania ... – agstudy

+0

Problem polega na tym, że chcę zrobić to tylko dla jednego z podlist na raz. W twoim przykładzie chciałbym uzyskać tylko dane wyjściowe 'cluster1', zapiszę to w pliku, a następnie zrobić to samo dla innych klastrów, z których każdy zapisuje do innego pliku. Dodałem wybrane wyniki do mojego pytania. Dzięki za pomoc. – dd3

4

Myślę, że podstawowym problemem jest to, że sposób iteracyjne tu jest nie tak.

Myślę, że coś jak to będzie działać lepiej:

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

tutaj jest dokumentacja pętli: http://manuals.bioinformatics.ucr.edu/home/programming-in-r#TOC-For-Loop dla podzbioru: http://www.statmethods.net/management/subset.html

powodzenia

+0

Dzięki za złapanie tego! Jednak nie rozwiązuje to całkowicie mojego problemu. (Chciałbym przegłosować twoją odpowiedź, ale nie mam takiej reputacji, przepraszam.) – dd3