【问题标题】:Merge nested lists into a data frame maintaining higher order list structure将嵌套列表合并到保持高阶列表结构的数据框中
【发布时间】:2019-04-11 00:14:43
【问题描述】:

我有一个由嵌套列表组成的列表。这些嵌套列表中的每一个都包含共享相同列的数据框。我想合并每个嵌套列表中的数据框,保持高阶列表。

我已尝试使用 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))

这正是我想要的数据结构,但在处理大数据时运行速度太慢了。

【问题讨论】:

  • 您能从data.table 中检查rbindlist,看看有没有改善? lapply(my.list, data.table::rbindlist) ?

标签: r list dataframe lapply do.call


【解决方案1】:

另一种选择是将purrr::mapdplyr::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)

【讨论】:

    猜你喜欢
    • 2018-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    • 2018-03-06
    • 2020-05-21
    相关资源
    最近更新 更多