迭代存储在R中的data.frame中的列表

时间:2013-02-09 03:20:13

标签: r for-loop dataframe loops

我认为这是一个初学者问题,但我似乎没有合适的词汇来进行有效的Google搜索。

我有一个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对应clusters[j]

中的项目

我试图通过使用每个群集的长度来做到这一点,我认为它类似于length(final$clusters[1]),但是它给出了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

2 个答案:

答案 0 :(得分:4)

我认为这里的主要问题是你在这里迭代的方式是错误的。

我认为这样的事情会更好:

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

这是文档 for循环:http://manuals.bioinformatics.ucr.edu/home/programming-in-r#TOC-For-Loop 用于子集化:http://www.statmethods.net/management/subset.html

祝你好运

答案 1 :(得分:4)

我认为您混淆了listdata.frame。我猜你的最终对象是一个列表。

迭代列表您可以使用rapply。它是lapply的递归版本。

例如:

## I create some reproducible example

cluster1 <- list(a='a',b='b')
cluster2 <- list(c='aaa',d='bbb')
clusters <- list(cluster1,cluster2)
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='')))