为什么 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 列。
我想将列表转换为数据框,代码如下:
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 列。