我正在尝试学习通过循环将约50个数字向量(每个向量具有约20k项)组合到数据帧中的适当方法。
这些向量以相同的顺序具有相同的名称,但值不同。它们看起来像:
#Vector 1
v1 = c(1, 20, 3, 2, 50)
names(v1) = c(geneA, geneB, geneC, geneD, geneE)
#Vector 2
v2 = c(25, 12, 43, 0, 50)
names(v2) = c(geneA, geneB, geneC, geneD, geneE)
#... total 50 vectors like these
我想在看起来像循环之后创建一个最终表(随意更改行名):
geneA geneB geneC geneD geneE
values_v1 1 20 3 2 50
values_v2 25 12 43 0 50
...
values_v50...
值得注意的是,数字向量是特定库的输出,因此我无法对其做很多事情。我当前循环的逻辑是从list()开始,并将数据帧一个接一个地追加。最后:
Reduce(function(...) merge(...), listDataFrames)
我不确定这是否是最好的方法。如果合理的话,您还可以指出上述命令中如何通过向量名称合并吗?非常感谢您,新年快乐。
答案 0 :(得分:3)
一种方法是将do.call
与rbind
一起使用
do.call(rbind, mget(ls(pattern = "^v")))
# geneA geneB geneC geneD geneE
#v1 1 20 3 2 50
#v2 25 12 43 0 50
我们可以手动找出50个向量,而不用手动输入它们的命名约定。根据提供的数据,向量似乎具有名称v1
,v2
,v3
,依此类推。因此,使用ls
命令可以获取所有以v
开头的对象。它将返回此类对象的列表。
mget(ls(pattern = "^v"))
#$v1
#geneA geneB geneC geneD geneE
# 1 20 3 2 50
#$v2
#geneA geneB geneC geneD geneE
# 25 12 43 0 50
,现在我们rbind
将所有此类对象放在一起。由于,向量遵循相同的名称顺序,所以应该没问题。
对Reduce
使用相同的逻辑也可以
Reduce(rbind, mget(ls(pattern = "^v")))