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

通过循环(R)将大型数值向量组合到数据帧中,r,vector,merge,reduce,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) #... tot

我正在尝试学习如何通过循环将~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
我希望在循环之后有一个最终的表(请随意更改行名称):

值得注意的是,数字向量是来自特定库的输出,因此我不能对它们做太多。我当前的循环逻辑是从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 
现在我们把所有这样的物体放在一起。因为向量遵循相同的名称顺序,所以这应该不是问题


使用与
Reduce
相同的逻辑也会起作用

Reduce(rbind, mget(ls(pattern = "^v")))

一种方法是使用
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 
现在我们把所有这样的物体放在一起。因为向量遵循相同的名称顺序,所以这应该不是问题


使用与
Reduce
相同的逻辑也会起作用

Reduce(rbind, mget(ls(pattern = "^v")))

亲爱的@Ronak-非常感谢!你的方法看起来很棒。但有一个问题,向量将在循环内部生成,因此它们将具有相同的名称。。。你是在建议我给它们取不同的名字吗?@Helene是的,因为如果它们有相同的名字,那么向量就会被覆盖,你就会失去它们。如果在循环中生成向量,也可以将它们存储在列表中,然后逐个追加。因此,在答案中,您将替换
mget(ls……
请说出您的列表名称。亲爱的@Ronak-非常感谢!您的方法看起来很棒。但有一个问题,向量将在循环中生成,因此它们将具有相同的名称……您是否建议我为它们指定不同的名称?@Helene是的,因为如果它们具有相同的名称,那么向量将结束如果你在循环中生成向量,你也可以将它们存储在一个列表中,然后一个接一个地追加它们。所以在答案中你替换了
mget(ls……
与列表名称分开。更新:我最终采用@Ronak Shah的建议,除了我使用do.call,而不是Reduce.do.call保留每个向量的名称作为行名称。更新:我最终采用@Ronak Shah的建议,除了我使用do.call,而不是Reduce.do.call保留每个向量的名称作为行名称。