如何使用更快的方式处理和组合列表中的数据帧

问题描述:

最后,我遇到了一个问题,那个数据处理非常缓慢,并附加了多个data.frames的行。我使用lapplydplyr组合进行数据处理。 OTH,由于每个数据帧中有20000行乘以目录中的100个文件,进程变得非常慢。如何使用更快的方式处理和组合列表中的数据帧

目前这对我来说是一个巨大的瓶颈,因为即使在lapply过程完成后我没有足够的内存来处理bind_rows过程。

这里是我的数据处理方法,

先的文件列表

files <- list.files("file_directory",pattern = "w.*.csv",recursive=T,full.names = TRUE) 

然后处理此文件列表

library(tidyr) 
    library(dplyr) 

data<- lapply(files,function(x){ 
    tmp <- read.table(file=x, sep=',', header = T,fill=F,skip=0, stringsAsFactors = F,row.names=NULL)%>% 

     select(A,B, C)%>% 
     unite(BC,BC,sep='_')%>% 

     mutate(D=C*A)%>% 
     group_by(BC)%>% 
     mutate(KK=median(C,na.rm=TRUE))%>% 
     select(BC,KK,D) 
    }) 

data <- bind_rows(data) 

我得到它说的错误,

“Error: cannot allocate vector of size ... Mb” ... depends on how much left in my ram. I have 8 Gb ram but seems still struggling;(

我也试过do.call,但没有任何改变!谁是我对这个问题的友好职能或方法? 我使用R版本3.4.2和dplyr 0.7.4。

+2

尝试使用data.table函数(fread,更新引用等)。我还建议阅读这些文件,不要进一步操作,然后用id绑定,然后运行分析一次,按“BC”和新文件ID分组。 –

+0

@ r2evans感谢您的评论。你是什​​么意思'从不使用它'我认为'%>%'操作符在读取'select'函数后传递列表中的每个文件? – Alexander

+0

你有错误吗?警告?你有什么迹象表明事情不对?您需要提供更多信息。 (你也应该包括所有正在使用的软件包,可能至少包括'dplyr'和'tidyr'。) – r2evans

我无法测试这个答案,因为没有可重复的数据,但我想这可能是像下面这样,使用data.table:

library(data.table) 

data <- setNames(lapply(files, function(x) { 
    fread(x, select = c("A", "B", "C")) 
}), basename(files)) 

data <- rbindlist(data, use.names = TRUE, fill = TRUE, id = "file_id") 
data[, BC := paste(B, C, sep = "_")] 
data[, D := C * A] 
data[, KK := median(C, na.rm = TRUE), by = .(BC, file_id)] 
data[, setdiff(names(data), c("BC", "KK", "D")) := NULL] 
+0

适合我开始!非常感谢! – Alexander

plyr包使用ldply将不再需要绑定列表后处理,因为它会输出一个数据。框架

library(tidyr) 
library(dplyr) 
library(plyr) 

files <- list.files("file_directory", pattern = "w.*.csv", recursive = TRUE, full.names = TRUE) 

data<- ldply(files, function(x){ 
    read.table(file=x, sep=',', header = TRUE, fill = FALSE, skip = 0, stringsAsFactors = FALSE, row.names = NULL) %>% 
    select(A, B, C) %>% 
    unite(BC, BC, sep='_') %>% 
    mutate(D = C * A) %>% 
    group_by(BC) %>% 
    mutate(KK = median(C, na.rm = TRUE)) %>% 
    select(BC, KK, D) 
}) 
+0

谢谢你。我会比较速度并在这里尽快反馈结果! – Alexander

+1

如果文件很大,通常'data.table'会运行得更快,但'ldply'有'.parallel'选项,读取大量文件时速度提高了50%。 – manotheshark

+0

谢谢你!我会记住这一点! – Alexander