2017-10-12 1 views
2

마지막으로, 매우 느린 데이터 처리와 복수 행 data.frames을 추가하는 문제가 있습니다. 데이터 처리를 위해 lapplydplyr 조합을 사용합니다. OTH,이 프로세스는 각 데이터 프레임에 20000 개의 행과 100 개의 파일을 곱한만큼 매우 느려집니다.목록에서 data.frames를보다 빠른 방법으로 처리하고 결합하는 방법

현재 이것은 lapply 프로세스가 완료된 후에도 나를위한 거대한 병목입니다. bind_rows 프로세스에 충분한 메모리가 없습니다. 여기

먼저 I라는 오류를 얻고있다

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) 

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

다음 파일 목록을 처리 할 파일의 목록을 확인

내 데이터 처리 방법

“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, 참조로 갱신 등)를 사용해보십시오. furrther 조작없이 파일을 읽은 다음 ID로 rbind 한 다음 "BC"및 새 file-id로 그룹화 된 분석을 한 번만 실행하는 것이 좋습니다. –

+0

@ r2evans 의견 주셔서 감사합니다. '결코 사용하지 말자 '는 의미는 무엇입니까?'%> 연산자가'select' 함수를 읽은 후리스트의 모든 파일을 전달한다고 가정합니까? – Alexander

+0

오류가 있습니까? 경고? 당신이 뭘 잘못하고 있다는 표시가 있습니까? 더 많은 정보를 제공해야합니다. (사용하고있는 모든 꾸러미를 포함해야합니다. 아마도'dplyr'와'tidyr' 이상일 것입니다.) – r2evans

답변

4

더 재현 데이터가 없기 때문에 나는이 대답을 테스트 할 수 없습니다하지만 난 data.table 사용하여, 그것은 다음과 같은 것을 할 수있을 것 같아요 다음 plyr 패키지에서 ldply를 사용

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

은 할 필요가 없습니다 것입니다 data.frame을 출력 할 때 처리 후 목록을 바인딩하십시오.

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

관련 문제