Почему rbind() и do.call(rbind, ) возвращают разные результаты?

Я хочу преобразовать список в фрейм данных со следующим кодом:

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

Результат, полученный путем добавления do.call, показан ниже. Он возвращает объект data.frame по желанию.

 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

person eclo.qh    schedule 28.01.2016    source источник
comment
do.call("rbind", ls) возвращает матрицу, а не фрейм данных. То же самое с rbind(ls).   -  person Rich Scriven    schedule 29.01.2016
comment
Поскольку do.call извлекает элементы из списка, в этом разница. Как будто вы бы сделали rbind(ls[[1]], ls[[2]])   -  person David Arenburg    schedule 29.01.2016
comment
Спасибо @RichardScriven, но вывод rbind(ls) по-прежнему является списком. На самом деле я хочу преобразовать список в матрицу   -  person eclo.qh    schedule 29.01.2016
comment
Нет, вывод rbind(ls) — это матрица. Он содержит элементы списка. См. class(rbind(ls))   -  person Rich Scriven    schedule 29.01.2016
comment
Если я использую > str(ls), он говорит, что это список. Хотя обе функции do.call(rbind, ls) и rbind(ls) возвращают матрицу, их результаты различны.   -  person eclo.qh    schedule 29.01.2016
comment
Спасибо @jenesaisquoi, так что разница заключается в объединении двух списков и объединении двух элементов.   -  person eclo.qh    schedule 29.01.2016
comment
Большое спасибо @DavidArenburg. Это помогает.   -  person eclo.qh    schedule 29.01.2016
comment
Потому что вы должны прочитать справочную страницу функции, прежде чем задавать такой вопрос. ?do.call   -  person Alex W    schedule 29.01.2016
comment
Прежде чем спрашивать, имеет смысл проверить страницу справки и поискать этот вопрос в stackoverflow. Если я не нашел решение, я опубликую его здесь. @Алекс   -  person eclo.qh    schedule 29.01.2016


Ответы (1)


do.call(rbind, ls) дает тот же результат, что и Reduce(rbind, ls). Последний менее эффективен, но он показывает, как вы перебираете объекты в ls, а не манипулируете ls (который представляет собой составной список из двух списков) напрямую.

Оба они работают, «удалив из списка» каждый элемент списка, который имеет класс numeric. Когда вы используете rbind числовых аргументов, результирующий класс представляет собой матрицу, где typeof является целым числом. Если вы просто rbind список, каждый элемент списка считается одним объектом. Таким образом, возвращенный объект представляет собой объект matrix с 1 строкой и 2 столбцами и элементами типа list. То, что у него 1 строка, должно быть очевидным, что он обрабатывает объект ls как одно, а не два объекта. Ввод rbind(ls, ls, ls) даст 3 строки и 2 столбца.

person AdamO    schedule 29.01.2016