2016-01-28 6 views
4

Я хочу, чтобы преобразовать список в dataframe, то коды:Почему rbind() и do.call (rbind,) возвращают другой результат?

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

результат путем добавления do.call, как показано ниже, он возвращает dataframe, который хотел

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

Однако если я просто использую функцию 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 
+1

'do.call (" rbind ", ls)' возвращает матрицу, а не кадр данных. То же самое с 'rbind (ls)'. –

+3

Потому что 'do.call' извлекает элементы из списка - вот в чем разница. Как будто вы делаете 'rbind (ls [[1]], ls [[2]]) –

+0

Спасибо @RichardScriven, но вывод' rbind (ls) 'по-прежнему является списком. На самом деле я хочу преобразовать список в матрицу –

ответ

4

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

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