为什么 rbind() 和 do.call(rbind, ) return 会有不同的结果?

Why do rbind() and do.call(rbind, ) return different results?

我想将列表转换为数据框,代码如下:

ls<-list(a=c(1:4),b=c(3:6))
do.call("rbind",ls)

加上do.call得到的结果如下图。它 returns 一个 data.frame 所需的对象。

 do.call("rbind",ls)
  [,1] [,2] [,3] [,4]
a    1    2    3    4
b    3    4    5    6

但是如果我直接使用 rbind,它 returns 一个列表。

为什么 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

do.call(rbind, ls) 提供与 Reduce(rbind, ls) 相同的输出。后者效率较低,但它用于显示您如何遍历 ls 中的对象,而不是直接操作 ls(这是 2 个列表的串联列表)。

它们都通过 "unlisting" 列表的每个元素进行操作,列表中有 class numeric。当您 rbind 数字参数时,生成的 class 是一个矩阵,其中 typeof 是整数。如果您只是 rbind 列表,则列表的每个元素都被视为单个对象。所以返回的对象是一个 matrix 对象,有 1 行和 2 列,条目类型为 list。它有 1 行应该表明它将对象 ls 视为一件事,而不是两件事。输入 rbind(ls, ls, ls) 将得到 3 行和 2 列。