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