如何优雅地使用rbind()函数将多个名称相似的数据框合并?

4

目前,我有多个名称相同且按运行顺序排列的数据框 (foo1, foo2, foo3, foo4, foo5 ...等)。我正在尝试使用rbind()创建一个包含上述所有数据框行的大型数据框。是否有一种优雅的方法可以将其与rbind(foo1, foo2, foo3, foo4, foo5...)等效呢?

我已尝试do.call(rbind, paste0("foo",i)),其中i = c(1,2,3...),但失败了。

此处提到了一种解决方案,即: do.matrix <- do.call(rbind, lapply( paste0("variable", 1:10) , get) )

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

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

谢谢。


他们所指的错误是在第一次创建各个数据帧 foo1foo2 等。如果最初将它们全部放入单个列表中,则可以将该列表直接传递给 do.call 并完成。 - joran
2
很可能你是通过assign创建了所有这些对象。这并不推荐,因为你可能会覆盖其他对象,并且可能无法有效地检索所有对象。更好的方法是初始化一个list,然后将其中每个元素设置为你的数据框之一。无论如何,在你的例子中,如果N是数据框的数量,那么do.call(rbind,mget(paste0("foo",1:N)))应该可以工作。 - nicola
1个回答

6

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

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

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

然后您的要求可以这样满足:
do.call(rbind, foo );

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


1
...或者使用mget,这可能是最不优雅的选项,如果真的无法返回并修复原始错误。 - joran

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接