Объединение вложенных списков в фрейм данных с сохранением структуры списка более высокого порядка - PullRequest
2 голосов
/ 11 апреля 2019

У меня есть список, состоящий из вложенных списков.Каждый из этих вложенных списков содержит фреймы данных, которые имеют одинаковые столбцы.Я хочу объединить кадры данных в каждом вложенном списке, сохраняя список более высокого порядка.

Я пытался сделать это с помощью lapply и do.call, но это занимает слишком много времени.Действительно, я получаю следующую ошибку:

Ошибка: исчерпана векторная память (достигнут предел?)

my.list <- replicate(100, replicate(10, data.frame(a = 1:5, b = 6:10), simplify = F), simplify = F)
my.list <- lapply(my.list, function(l) do.call("rbind", l))

Это дает мне именно ту структуру данных, которую я хочу,но работает слишком медленно с большими данными.

1 Ответ

1 голос
/ 11 апреля 2019

Другой вариант - использовать purrr::map с dplyr::bind_rows

library(purrr)
library(dplyr)
map(my.list, bind_rows)

Вот сравнение microbenchmark различных методов

library(purrr)
library(dplyr)
library(data.table)    

library(microbenchmark)
res <- microbenchmark(
    lapply_do_call_rbind = {
        lapply(my.list, function(l) do.call("rbind", l))
    },
    map_bind_rows = {
        map(my.list, bind_rows)
    },
    lapply_rbindlist = {
        lapply(my.list, rbindlist)
    }
)
#Unit: milliseconds
#                 expr       min        lq      mean    median        uq
# lapply_do_call_rbind 46.104965 49.801469 54.567249 51.815901 54.085547
#        map_bind_rows  3.257474  3.490079  4.055779  3.620804  4.002505
#     lapply_rbindlist  9.446331 10.009678 11.429870 10.796956 12.252741

library(ggplot2)
autoplot(res)

enter image description here

...