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



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

我不确定这是否是最好的方法。如果这样做是合理的,您能否也指出如何通过上述命令中的矢量名称进行合并?非常感谢你,新年快乐。

一种方法是将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")))

最新更新