2013-07-26 3 views
0

У меня есть каталог идентично структурированных CSV-файлов. Я пытаюсь загрузить все из них в один файл data.frame. В настоящее время я использую lapply() с read.csv(), чтобы получить список data.frames, и я ищу элегантный способ преобразования этого списка в data.frame, который избегает явного цикла.упрощение произвольно длинного списка кадров данных в единый фрейм данных

В результате моего lapply(list.of.file.names,read.csv) может быть аппроксимирована этой структуры:

list.of.dfs <- list(data.frame(A=sample(seq(from = 1, to = 10), size = 5), 
           B=sample(seq(from = 1, to = 10), size = 5)), 
        data.frame(A=sample(seq(from = 1, to = 10), size = 5), 
           B=sample(seq(from = 1, to = 10), size = 5)), 
        data.frame(A=sample(seq(from = 1, to = 10), size = 5), 
           B=sample(seq(from = 1, to = 10), size = 5)) 
        ) 

Что элегантную версию следующей строки, которая работает для произвольных списков длины:

one.data.frame <- rbind(list.of.dfs[[1]],list.of.dfs[[2]],list.of.dfs[[3]]) 

Я могу это сделать с циклом for, но существует ли векторное решение?

+4

'do.call (rbind, list.of.dfs)' – user1609452

+0

Да, это удивительно легко, если вы знаете, что делает 'do.call'. – Marius

+1

Yup, это дубликат. Почему-то я не нашел более раннего. Застенчиво голосуя, чтобы закрыть мой собственный вопрос. – MattBagg

ответ

5

do.call - это основной способ сделать это.

do.call(rbind, list.of.dfs) 

Но это может быть медленным, если у вас много элементов данных и другие обсуждения здесь на S.O. сосредоточились на том, как ускорить работу, используя пользовательские функции или пакеты data.table или plyr. Например:

Why is rbindlist "better" than rbind?

Can rbind be parallelized in R?

Performance of rbind.data.frame

4

@thelatemail ссылался на него, но вы можете использовать следующие скорости:

rbindlist(list.of.dfs) 

(требует library(data.table))

Смежные вопросы