2017-10-12 48 views
2

最後,我遇到了一個問題,那個數據處理非常緩慢,並附加了多個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

回答

4

我無法測試這個答案,因爲沒有可重複的數據,但我想這可能是像下面這樣,使用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

2

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

相關問題