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

1

8

I want to convert a list to a data frame, with the following code:

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

The result obtained by adding do.call is as shown below. It returns a data.frame object as desired.

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

However if I directly use rbind, it returns a list.

Why does rbind behave differently in these two situations?

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
Multiplication answered 28/1, 2016 at 23:32 Comment(9)
do.call("rbind", ls) returns a matrix, not a data frame. Same with rbind(ls).Aporia
Because do.call extracts the elements out of the list- that's the difference. As if you would do rbind(ls[[1]], ls[[2]])Chough
Thank you @RichardScriven, but the output of rbind(ls) is still a list. Actually what I want is to convert a list to a matrixMultiplication
No, the output of rbind(ls) is a matrix. It contains list elements. See class(rbind(ls))Aporia
If I use > str(ls), it says it is a list. Though both do.call("rbind", ls) and rbind(ls) return a matrix, the outcome of them are differentMultiplication
Thank you @jenesaisquoi, so the difference lies in combinding two list and combinding two elements.Multiplication
Thank you so much @DavidArenburg. It helps.Multiplication
Because you should read the help page of the function before asking such a question. ?do.callDonndonna
It is common sense to check the help page and search this question in stackoverflow before asking. If I didn't get the solution, I will post it here. @AlexMultiplication
F
13

do.call(rbind, ls) gives you the same output as Reduce(rbind, ls). The later is less efficient, but it serves to show how you are iterating over the objects in ls rather than manipulating ls (which is a concatenated list of 2 lists) directly.

They both operate by "unlisting" each element of the list, which has class numeric. When you rbind numeric arguments, the resulting class is a matrix with typeof being integer. If you just rbind the list, each element of the list is considered a single object. So the returned object is a matrix object with 1 row and 2 columns and entries of type list. That it has 1 row should make it apparent it's treating the object ls as one thing, and not two things. Typing rbind(ls, ls, ls) will give 3 rows and 2 columns.

Furniture answered 29/1, 2016 at 0:0 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.