【问题标题】:Iterating over lists stored in data.frame in R迭代存储在 R 中的 data.frame 中的列表
【发布时间】:2013-01-24 22:16:31
【问题描述】:

我认为这是一个初学者问题,但我似乎没有正确的词汇来进行有效的 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

【问题讨论】:

    标签: r for-loop dataframe loops


    【解决方案1】:

    我认为您混淆了listdata.frame。我猜你的 final is object 是一个列表。

    要遍历列表您可以使用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 编写文件。这里我使用列表中元素的名称来创建文件名。在您的情况下,您的文件名将是 number.(1.txt,...)

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

    【讨论】:

    • 所以rapply 正在按照您的说法工作,打印出列表列表(感谢您的澄清)。但是,我想一次只打印一个列表(实际上,我希望使用sink 将每个clusters 打印到不同的文件中),但我无法让print 工作,使用 @pipo98 的帮助和你的帮助:for (j in final$clusters){ rapply(final$clusters[j], f = print) } 返回多行 NULL
    • @dd3 无需将rapplyfor 结合使用。 Rapply 将反复浏览列表以获取叶子.. 请您输入dput(str(final)) 并将其添加到您的问题中...
    • 问题是我一次只想为其中一个子列表执行此操作。在您的示例中,我只想获取cluster1 的输出,将其写入文件,然后对其他集群执行相同操作,每个集群都写入不同的文件。我已将您要求的输出添加到我的问题中。感谢您的帮助。
    【解决方案2】:

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

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

    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

    祝你好运

    【讨论】:

    • 感谢收看这个!但是,它并不能完全解决我的问题。 (我会赞成你的回答,但我没有这样做的声誉。对不起。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-17
    • 1970-01-01
    • 2013-10-04
    • 1970-01-01
    相关资源
    最近更新 更多