Ответ 1
Смотрите ?rbindlist
и эти связанные вопросы (проще найти, когда вы знаете, что искать!):
Существует ли конкретный метод объединения списка данных в таблицы R?
У меня есть список из ~ 20 data.tables, каждый из которых содержит около 1 миллиона строк, и хотел бы объединить их в одну таблицу данных с 20 миллионами строк.
Я делал это с помощью
Reduce('rbind', data.table)
но требуется некоторое время.
Tnx!
Смотрите ?rbindlist
и эти связанные вопросы (проще найти, когда вы знаете, что искать!):
Использование 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
Я не понимал, что data.table
имеет определенную функцию для этой задачи. Par для курса, это довольно быстро. Вот подходящее время:
system.time(out3 <- rbindlist(yourList))
#-----
user system elapsed
0.07 0.03 0.11
all.equal(out1,out3)
#-----
[1] TRUE
За свои деньги пакет plyr ldply
- это способ сделать это. У меня есть то преимущество, что имя элемента списка добавляется как новый первый столбец с именем .id
.
Кроме того, список кадров данных часто является результатом tapply
, и в этом случае заменить весь shebang на ddply
.
Альтернативы включают do.call("rbind", mylist)
или решетку make.groups
(пока не удалось найти эту последнюю).
Примечание. Возможно, я неправильно понял вопрос - я прочитал data.frame
вместо data.table
. Эти методы все еще работают, но я не уверен, что они все равно будут data.table
.