我认为这是一个初学者问题,但我似乎没有合适的词汇来进行有效的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
答案 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)
我认为您混淆了list
和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)
所以使用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='')))