【问题标题】:elegant way to use rbind() on multiple dataframes with similar names?在具有相似名称的多个数据帧上使用 rbind() 的优雅方式?
【发布时间】:2019-10-02 07:12:43
【问题描述】:

目前,我有多个同名且按运行顺序排列的数据帧(foo1foo2foo3foo4foo5... 等)。我正在尝试使用rbind() 创建一个包含上述数据框所有行的大型数据框。有没有一种优雅的方式来做到这一点,相当于rbind(foo1, foo2, foo3, foo4, foo5...)

我试过do.call(rbind, paste0("foo",i)) 哪里i=c(1,2,3...) 无济于事。

有一个solution mentioned here,即: do.matrix <- do.call(rbind, lapply( paste0("variable", 1:10) , get) )

然而,答案神秘地说“这是处理相关项目的错误方法。最好使用列表或数据框,但您可能会在适当的时候找出原因。”

为什么这样做是错误的方式,什么是“正确”的方式?

谢谢。

【问题讨论】:

  • 他们所指的错误是首先创建单独的数据框foo1foo2等。如果您首先将它们全部放在一个列表中,您可以将该列表传递给 do.call 并完成它。
  • 您很可能通过assign 创建了所有这些对象。不建议这样做,因为您可能会覆盖其他对象并且您可能无法有效地检索所有对象。最好初始化一个list,然后将它的每个元素设置为你的data.frames之一。无论如何,如果 N 是 data.frames 的数量,do.call(rbind,mget(paste0("foo",1:N))) 应该可以在您的示例中使用。

标签: r


【解决方案1】:

始终尝试严格捕捉相关数据实例、相关数据和方法或相关方法之间的关系。这通常有助于简化聚合操作,例如您的 rbind 要求。

对于您的情况,您应该从一开始就将相关的 data.frames 定义为单个列表:

foo <- list(data.frame(...), data.frame(...), ... );

这样就可以满足你的要求了:

do.call(rbind, foo );

如果为时已晚,那么涉及重复调用 get() 的解决方案(如您链接到的文章中所述)可以完成这项工作。

【讨论】:

  • ...或mget,如果一个人真的无法回去修复原罪,这可能是最不优雅的选择。
猜你喜欢
  • 2023-03-26
  • 1970-01-01
  • 2015-04-18
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
  • 1970-01-01
  • 2019-05-09
相关资源
最近更新 更多