通过循环(R)将大型数值向量组合到数据帧中
我正在尝试学习如何通过循环将~50个数值向量(每个向量有~20k个项)组合到数据帧中 这些向量具有相同顺序的相同名称,但值不同。它们看起来像:通过循环(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
#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保留每个向量的名称作为行名称。