У меня есть код, который в одном месте заканчивается со списком кадров данных, которые я действительно хочу преобразовать в единственный кадр больших данных.
Я получил некоторые указатели от более раннего вопроса, который пытался сделать что-то подобное, но более сложное.
Вот пример того, что я запускаю с (это чрезвычайно упрощено для иллюстрации):
listOfDataFrames <- vector(mode = "list", length = 100)
for (i in 1:100) {
listOfDataFrames[[i]] <- data.frame(a=sample(letters, 500, rep=T),
b=rnorm(500), c=rnorm(500))
}
Я в настоящее время использую это:
df <- do.call("rbind", listOfDataFrames)
Другой вариант - использовать функцию plyr:
df <- ldply(listOfDataFrames, data.frame)
Это немного медленнее, чем оригинал:
> system.time({ df <- do.call("rbind", listOfDataFrames) })
user system elapsed
0.25 0.00 0.25
> system.time({ df2 <- ldply(listOfDataFrames, data.frame) })
user system elapsed
0.30 0.00 0.29
> identical(df, df2)
[1] TRUE
Я думаю, что использование do.call("rbind", ...)
будет самым быстрым подходом, который вы найдете, если только вы не сможете сделать что-то вроде (a) использования матриц вместо data.frames и (b) предварительного выделения конечной матрицы и присвоения ей, а не ее роста.
Edit 1:
Основываясь на комментарии Хэдли, вот последняя версия rbind.fill
из CRAN:
> system.time({ df3 <- rbind.fill(listOfDataFrames) })
user system elapsed
0.24 0.00 0.23
> identical(df, df3)
[1] TRUE
Это проще, чем rbind, и немного быстрее (эти временные показатели сохраняются в течение нескольких запусков). И насколько я понимаю, версия plyr
на github даже быстрее, чем эта.