2013-02-09 84 views
5

我認爲這是一個初學者問題,但我沒有看到有效的谷歌搜索的正確詞彙。對存儲在data.frame中的列表進行迭代R

我有一個data.frame,final,它包含一個列表clusters,其中每個是一個字符串列表。

我想迭代每個集羣中的字符串列表:for循環內的for循環。

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

j對應列出clusters,並且i通過使用每個集羣的長度,而且我認爲他會像length(final$clusters[1])對應項clusters[j]

我試圖做到這一點,但是這給出1,而不是列表的長度。

此外,final$clusters[1]給$ '1',並在下一行,在集羣中的所有字符串1

感謝。

編輯:的dput(str(final))輸出的要求:

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 

回答

3

我想你混淆listdata.frame。我猜你最後的對象是一個列表。

要遍歷列表您可以使用rapply。它是lapply的遞歸版本。

例如:

## I create some reproducible example 

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

因此,使用rapply

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

更新編輯後OP

使用lapply,我遍歷列表的名稱。對於每個名稱,我使用[[獲得元素列表(如果您使用魔杖獲取文件名和文件夾,則可以使用[),然後使用write.table編寫該文件。這裏我使用列表中元素的名稱來創建文件名。 (1.txt,...)

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

所以'rapply'正如你所說的那樣工作,列出清單清單(感謝您的澄清)。但是,我想一次僅打印一個列表(實際上,我希望使用「sink」將每個「簇」打印到不同的文件中),但我無法使用「打印」功能,使用@ pipo98的幫助和你的:'for(j in final $ clusters){rapply(final $ clusters [j],f = print)}'返回許多行NULL。 – dd3 2013-02-09 21:35:15

+0

@ dd3不需要將'rapply'和'for'結合起來。 'Rapply'將通過列表重新獲得樹葉..我可以請輸入'dput(str(final))'並將其添加到您的問題中... – agstudy 2013-02-09 22:01:18

+0

問題是我只想爲此做一個在一次的子列表中。在你的例子中,我只想得到'cluster1'的輸出,將它寫到一個文件中,然後對其他簇執行相同的操作,每個簇寫入不同的文件。我已將您請求的輸出添加到我的問題中。謝謝你的幫助。 – dd3 2013-02-09 22:47:38

4

我覺得這裏的主要問題是,你在這裏迭代的方式是錯誤的。

我覺得這樣的事情會更好地工作:

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

這裏是循環的文檔 :http://manuals.bioinformatics.ucr.edu/home/programming-in-r#TOC-For-Loop 的子集:http://www.statmethods.net/management/subset.html

好運

+0

感謝您的支持!但是,這並不能完全解決我的問題。 (我會贊成你的回答,但我沒有這樣的聲望,對不起。) – dd3 2013-02-09 21:19:20