R 提高循环中绑定_行的速度(3000个数据帧)

R 提高循环中绑定_行的速度(3000个数据帧),r,dplyr,tidyverse,tibble,R,Dplyr,Tidyverse,Tibble,我已经分析了一个非常大的数据库,它有超过500万条数据线和40列。 出于实际原因,结果被分割成小的“.Rdata”文件。 我总共有3000多个文件,每个文件的大小都达到1Mb 我已经设计了一个快速循环,使用dplyr将这些文件合并成一个单数据帧,但是这非常慢,我相信有更快的方法来实现 我尝试使用矩阵进行预分配,但我的数据是文本和数字,并且出现了错误。 使用基本R时,数据帧甚至更慢 list_files = as.data.frame(list.files(path = "output", pat

我已经分析了一个非常大的数据库,它有超过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)}
    }
list\u files=as.data.frame(list.files(path=“output”,pattern='Rdata'))
名称(列表文件)=“全名”
列表文件=列表文件%>%
单独(全名,sep=“”,“into=c('col1','col2'))%>%
分离(col2,sep='.R',进入=c('col3','col4'))%>%
变异(col3=as.numeric(col3))%>%
排列(col3)%>%变异(col3=as.character(col3))
数据x%bind\u行(结果\u df2)
如果((i%%100)=0){print(i)}
}

是否有更有效的方法编写此循环?

使用
purr::map
purrr::reduce
,您可以导入和绑定它们,而无需使用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)
库(purrr)
图书馆(dplyr)
#将数据帧另存为rds
#mtcars%>%saveRDS(“mtcars1.rds”)
#mtcars%>%saveRDS(“mtcars2.rds”)
#列出文件
文件%map(readRDS)%%>%
减少(绑定行)

另一个带有data.table的选项

library(data.table)
library(dplyr)

list_files = list.files(path = "output", pattern = 'Rdata')
lapply(list_files, function(x) load(x) %>% data.table() ) %>% rbindlist()  

使用dplyrbind_行

system.time( for(i in 1:50) { datax = datax %>% bind_rows( ll[[i]]) })
结果

user  system elapsed 
2.70    0.15    2.87  
 user  system elapsed 
 0.05    0.00    0.04 
使用rbindlist功能


system.time(如果我错了,ans1会纠正我,但即使map是用rcpp或cpp或更智能的方式编写的循环?无论如何都会用基准测试进行测试。谢谢。我不知道这个问题的答案。我不能像使用load()时那样将此代码应用于我的Rdata文件类比我得到了以下错误:
错误:参数1必须有名称
@Arkadiw请在完成后发布结果。您的代码需要永远运行,而绑定行需要7秒才能运行50个文件。非常好!现在将发布此结果。