Подтвердить что ты не робот

Объедините список data.tables

Существует ли конкретный метод объединения списка данных в таблицы R?

У меня есть список из ~ 20 data.tables, каждый из которых содержит около 1 миллиона строк, и хотел бы объединить их в одну таблицу данных с 20 миллионами строк.

Я делал это с помощью

Reduce('rbind', data.table)

но требуется некоторое время.

Tnx!

4b9b3361

Ответ 2

Использование do.call в этом примере составляет примерно 10 раз быстрее:

library(data.table)

x1 <- data.table(x = runif(1e6), y = runif(1e6))
x2 <- data.table(x = runif(1e6), y = runif(1e6))

#20 data.tables all of length 1e6
yourList <- list(x1,x2,x1,x2,x1,x2,x1,x2,x1,x2,x1,x2,x1,x2,x1,x2,x1,x2,x1,x2)

system.time(out1 <- Reduce("rbind", yourList))
#-----
   user  system elapsed 
   3.37    3.03    6.43 
system.time(out2 <- do.call("rbind", yourList))
#-----
   user  system elapsed 
   0.33    0.36    0.68 
all.equal(out1,out2)
#-----
[1] TRUE

Изменить - включить ответ Matt

Я не понимал, что data.table имеет определенную функцию для этой задачи. Par для курса, это довольно быстро. Вот подходящее время:

system.time(out3 <- rbindlist(yourList))
#-----
   user  system elapsed 
   0.07    0.03    0.11 

all.equal(out1,out3)
#-----
[1] TRUE

Ответ 3

За свои деньги пакет plyr ldply - это способ сделать это. У меня есть то преимущество, что имя элемента списка добавляется как новый первый столбец с именем .id.

Кроме того, список кадров данных часто является результатом tapply, и в этом случае заменить весь shebang на ddply.

Альтернативы включают do.call("rbind", mylist) или решетку make.groups (пока не удалось найти эту последнюю).


Примечание. Возможно, я неправильно понял вопрос - я прочитал data.frame вместо data.table. Эти методы все еще работают, но я не уверен, что они все равно будут data.table.