【问题标题】:Combine large numeric vectors into a dataframe via loop (R)通过循环(R)将大数值向量组合成一个数据帧
【发布时间】:2019-05-29 15:09:25
【问题描述】:

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

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

【问题讨论】:

  • 更新:我最终采纳了@Ronak Shah 的建议,除了我使用了 do.call,而不是 Reduce。 do.call 将每个向量的名称保留为行名称。

标签: r vector merge reduce


【解决方案1】:

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

【讨论】:

  • 亲爱的@Ronak - 非常感谢!你的方法看起来很棒。但是有一个问题,向量将在循环内生成,因此它们将具有相同的名称……您是否建议我为它们分配不同的名称?
  • @Helene 是的,因为如果它们具有相同的名称,那么向量将被覆盖并且您将丢失它们。如果您在循环中生成向量,您也可以将它们存储在一个列表中并一个接一个地附加它们。因此,在答案中,您将 mget(ls...... 部分替换为您的列表名称。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-18
  • 2021-12-28
  • 2020-01-06
  • 2014-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多