通过循环(R)将大数值向量合并到数据帧中

时间:2019-01-03 01:38:31

标签: r vector merge reduce

我正在尝试学习通过循环将约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)

我不确定这是否是最好的方法。如果合理的话,您还可以指出上述命令中如何通过向量名称合并吗?非常感谢您,新年快乐。

1 个答案:

答案 0 :(得分:3)

一种方法是将do.callrbind一起使用

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个向量,而不用手动输入它们的命名约定。根据提供的数据,向量似乎具有名称v1v2v3,依此类推。因此,使用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")))