2014-12-26 3 views
-1

내 데이터에 하나의 열이 있는데 행의 각 "/"다음에 열을 추가로 만들려고합니다. 내 관련된 이전 질문에 대한 답변은 here입니다. system.time(replicate(75000000, res.df))가 오류를 반환 작업 속도를 높이는 방법 R

res <- strsplit(as.character(mydata$ALL),"/", fixed=T) 
res.df <- as.data.frame(do.call(rbind, lapply(lapply(res, factor, levels 
=unique(unlist(res))), table))) 

하지만 매우 느린 행 수백만

... :

> dput(mydata) 
structure(list(ALL = structure(c(1L, 4L, 4L, 3L, 2L), .Label = c("/ca/put/ 
sent_1/fe.gr/eq2_on/eq2_off", 
"/ca/put/sent_1/fe.gr/eq2_on/eq2_off/cbr_LBL", "/ca/put/sent_1/fe.gr/eq2_o 
n/eq2_off/cni_at.p3x.4", 
"/ca/put/sent_1/fe.gr/eq2_on/eq2_off/hi.on/hi.ov"), class = "factor")), .N 
ames = "ALL", class = "data.frame", row.names = c(NA, 
-5L)) 

다음 작품 5 행의 샘플에 잘 : 여기에 데이터의 처음 5 행은 타이밍 563.04 21.28 644.77

(Error: cannot allocate vector of size 2.8Gb...):

에서 정지 원래 데이터 400M 통해 행 및 "/"의 생성은 약 100 열 사이의 문자열이다. R에서 위의 작업을 빠르게 할 수있는 방법이 있습니까?

+0

이전 질문에서 Tyler의 대답을 시도하십시오. 내 시스템에 대한 빠른 테스트를 통해 자신이 가장 빠르다고 나타났습니다. – A5C1D2H2I1M1N2O1R2T1

+0

테스트 데이터보다 큰 데이터에 대한 응답을 벤치마킹 했습니까? 테스트가 매우 작기 때문에 일부 솔루션은 더 큰 데이터로 더 잘 확장되고 현재의 방법보다 빠르게 될 수 있습니다. –

+2

나는 문제가 RAM에서 빠져서 속도가 아니라고 생각한다. (이것은 오류 메시지가 기본적으로 알려주는 것이다.) 하지만 400MM 행은 R에서의 복잡한 작업을위한 엄청난 양의 데이터 세트입니다. –

답변

-1

모두 속도가 느린 경우 실제로 대안이 있습니다. 그 열을 파일에 써 넣은 다음 sep = "/"를 사용하여 구분 된 파일로 읽습니다. 그런 다음 두 개의 data.frames를 바인딩합니다.

특별히 우아하지는 않지만.

+0

고유 한 분할 값이 열 이름이되는 이진 테이블 - 원하는 출력을 오해 한 것 같습니다. – A5C1D2H2I1M1N2O1R2T1

0

res.df의 생성 속도를 높이는 데 도움이되는 것은 두 가지입니다. 첫째, 매 반복마다 unique(unlist(res))을하고 싶지 않습니다. 둘째, lapply에 사용 된 함수를 결합하여 데이터를 한 번만 통과하면됩니다. functional 패키지의 Compose을 사용할 수 있지만 직접 작성하는 것만 큼 쉽습니다.

lvls <- unique(unlist(res)) 
helper <- function(x) 
{ 
    table(factor(x, levels=lvls)) 
} 

res.df <- as.data.frame(do.call(rbind, lapply(res, helper))) 

이 데이터 세트를 사용하면 문제가 해결되지 않을 수도 있지만 시작할 장소입니다.

+0

나는 그것을 시도했다. .. 그것은 더 천천히이다 :( – bma92

관련 문제