r - 提高循环内 bind_rows 的速度(3000 个数据帧)

标签 r dplyr tidyverse tibble

我已经解析了一个非常大的数据库,其中包含超过 500 万条数据行和 40 列。 出于实际原因,结果被分成小的“.Rdata”文件。 我总共有 3000 多个文件,每个文件的大小最大为 1Mb。

我设计了一个快速循环,使用 dplyr 将这些文件组合成一个数据帧,但这非常慢,我相信有更快的方法。

我尝试使用带有预分配的矩阵,但我的数据既是文本又是数字,并且出现错误。 使用基础 R 时,数据帧甚至更慢。

list_files = as.data.frame(list.files(path = "output", pattern = 'Rdata'))
names(list_files) = 'full_name'

list_files = list_files %>% 
    separate(full_name, sep ="_", into = c('col1','col2')) %>% 
        separate(col2, sep = '.R', into = c('col3','col4')) %>%
            mutate(col3 = as.numeric(col3)) %>% 
            arrange(col3) %>%  mutate(col3 = as.character(col3))

datax <- c()

for(i in 1:length(list_files$col3))
    {
        load(paste('output/MyData_',list_files$col3[i],'.Rdata',sep=''))
##here loads results_df2
        datax = datax %>% bind_rows(results_df2)
        if((i %% 100) == 0) { print(i)}
    }

有没有更有效的方法来编写这个循环?

最佳答案

使用 purrr::mappurrr::reduce,您可以导入并绑定(bind)它们,而无需使用 for 循环。

library(purrr)
library(dplyr)

# save data frame as rds
# mtcars %>% saveRDS("mtcars1.rds")
# mtcars %>% saveRDS("mtcars2.rds")

# list files
files <- list.files(pattern = "rds")

# read and bind
files %>% map(readRDS) %>% 
                reduce(bind_rows)

关于r - 提高循环内 bind_rows 的速度(3000 个数据帧),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56076736/

相关文章:

仅针对其副作用按行运行表达式

r - 如何通过将现有行的值与 R dplyr 组合来将行添加到数据帧

r - 如何将 purrr::map 与数据框列表一起使用来修改特定数据框中的列值而不更改列表中的其他数据框?

r - Shiny 和 ggplot2 具有多行

r - 如何从尾部提取 - 符号并将其放在数字之前

r - 循环保持变量名 R

r - 使用 ggplot 构建聚类图

rle() : Return average of lengths only if values == TRUE

在 R 中使用 gsub() 将 "."替换为空格?

r - 从 tidyverse 包中消除 ungroup... 消息