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

ble*_*lep 5 loops for-loop r dataframe

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

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

我想迭代每个集群中的字符串列表:for循环中的for循环.

for (j in final$clusters){
    for (i in final$clusters$`j`){
        print final$clusters$`j`[i]
    }
}
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

ags*_*udy 4

我认为你混淆了 alist和 a data.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)
Run Code Online (Sandbox Code Playgroud)

所以使用rapply

rapply(final,f=print)
[1] "a"
[1] "b"
[1] "aaa"
[1] "bbb"
    a     b     c     d 
  "a"   "b" "aaa" "bbb" 
Run Code Online (Sandbox Code Playgroud)

OP编辑后更新

使用lapply,我循环遍历列表的名称。对于每个名称,我使用[[[如果您想获取文件的名称和heder,则可以使用)获取元素列表,然后使用write.table. 这里我使用列表中元素的名称来创建文件名。在您的情况下,您的文件名将是数字。(1.txt,...)

    lapply(names(final$clusters),
                      function(x)
                             write.table(x=final$clusters[[x]],
                                         file=paste(x,'.txt',sep='')))
Run Code Online (Sandbox Code Playgroud)