为什么rbind()和do.call(rbind, )返回不同的结果?

6
我希望将列表转换为数据框,使用以下代码:
ls<-list(a=c(1:4),b=c(3:6))
do.call("rbind",ls)

通过添加do.call获得的结果如下所示。它按照预期返回了一个对象。
 do.call("rbind",ls)
  [,1] [,2] [,3] [,4]
a    1    2    3    4
b    3    4    5    6

然而,如果我直接使用rbind,它会返回一个列表。

为什么rbind在这两种情况下的行为不同?

my.df<-rbind(ls)
str(ls)


 my.df
   a         b        
ls Integer,4 Integer,4

 str(ls)
List of 2
 $ a: int [1:4] 1 2 3 4
 $ b: int [1:4] 3 4 5 6

2
do.call("rbind", ls) 返回的是一个矩阵,而不是数据框。rbind(ls) 同样如此。 - Rich Scriven
3
因为do.call会将列表中的元素提取出来,这就是它与直接使用rbind(ls[[1]], ls[[2]])的区别。 - David Arenburg
3
不是的,rbind(ls)的输出是一个矩阵,其中包含列表元素。可以查看class(rbind(ls)) - Rich Scriven
谢谢@jenesaisquoi,所以区别在于合并两个列表和合并两个元素。 - eclo.qh
1
在提出这样的问题之前,您应该阅读函数的帮助页面。?do.call - alexwhitworth
显示剩余4条评论
1个回答

9
do.call(rbind, ls) 给出的输出与 Reduce(rbind, ls) 相同。后者的效率较低,但它可以展示你是如何迭代处理 ls 中的对象而不是直接操作 ls(一个包含 2 个列表的连接列表)。

它们都通过 "展开" 列表中的每个元素来操作,这些元素的类别为 numeric。当你使用 rbind 合并数值参数时,结果的类别是一个带有 typeof 为整数的矩阵。如果你只是用 rbind 合并列表,则列表中的每个元素被视为单个对象。因此返回的对象是一个具有 1 行和 2 列以及类型为 list 的条目的 matrix 对象。它仅有的 1 行应该表明它将对象 ls 视为一个整体,而不是两个东西。键入 rbind(ls, ls, ls) 将给出 3 行和 2 列。


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