2014-07-09 3 views
0

파일을 구문 분석하고 정보를 얻으려는 R 스크립트가 있지만 파일은 44GB입니다.R 스크립트를 perl로 만드시겠습니까?

파일을 더 빨리 읽는 프로그래밍 언어로이 글을 쓸 수있게 도와 줄 수 있습니까?

스크립트는 아주 간단합니다 :

ld <- read.table("plink-inter-chr---ld-window-r2-0.ld", header = T) 
ldv1 <- do.call(rbind, strsplit(as.character(ld[,1]), "_")) 
ldv4 <- do.call(rbind, strsplit(as.character(ld[,4]), "_")) 
ld <- matrix(c(ldv1[,2], ldv4[,2], ld[,2], ld[,5], ld[,7]), ncol=5) 
N <- 30 
within <- numeric(N) 
between <- numeric(N) 
for(i in 1:N){ 
within[i] <- mean(as.numeric(ld[which(ld[,1] == i & ld[,2] == i),5])) 
between[i] <- mean(as.numeric(ld[which(ld[,1] == i & ld[,2] != i),5])) 
} 
table <- matrix(c(within, between), ncol=2) 
write.table(table, file = "within-between.tab", quote = FALSE, row.names = FALSE, col.names = FALSE) 

그리고 파일과 같은 같습니다

CHR_A   BP_A SNP_A CHR_B   BP_B SNP_B   R2   DP 
NODE_1_length_193190_coverage_19.3759_GC_24.97   919 . NODE_1_length_193190_coverage_19.3759_GC_24.97   2210 .   1   1 
NODE_1_length_193190_coverage_19.3759_GC_24.97   919 . NODE_1_length_193190_coverage_19.3759_GC_24.97   2419 .   1   1 
NODE_1_length_193190_coverage_19.3759_GC_24.97   919 . NODE_1_length_193190_coverage_19.3759_GC_24.97   2524 .   1   1 
NODE_1_length_193190_coverage_19.3759_GC_24.97   919 . NODE_1_length_193190_coverage_19.3759_GC_24.97   2587 .   1   1 
NODE_1_length_193190_coverage_19.3759_GC_24.97   919 . NODE_1_length_193190_coverage_19.3759_GC_24.97   2799 .   1   1 
NODE_1_length_193190_coverage_19.3759_GC_24.97   919 . NODE_1_length_193190_coverage_19.3759_GC_24.97   2947 .   1   1 
NODE_1_length_193190_coverage_19.3759_GC_24.97   919 . NODE_1_length_193190_coverage_19.3759_GC_24.97   3142 .   1   1 
NODE_1_length_193190_coverage_19.3759_GC_24.97   919 . NODE_1_length_193190_coverage_19.3759_GC_24.97   3178 .   1   1 
NODE_1_length_193190_coverage_19.3759_GC_24.97   919 . NODE_1_length_193190_coverage_19.3759_GC_24.97   3261 .   1   1 

는 R에 도움, 아드리안

+0

R에 익숙하지 않은 사용자에게 출력 결과를 보여줄 수 있습니까? – mob

+0

@AdrianP : 귀하의 * "누군가가 파일 읽기 속도가 빠른 프로그래밍 언어로 이것을 작성할 수 있습니까?"라는 의미입니까? 어떤 언어를 알고 있으며 어떤 도움이 필요합니까? 나는 이것이 귀하의 고용과 관련이 있다고 생각하며 다른 사람의 노력을 위해 사용하고 지불하는 것은 매우 잘못 될 것입니다. – Borodin

+0

http://mysite.science.uottawa.ca/ncorradi/members.html 제 주인을하고 있습니다. 과학에서. 나는 나의 주인을 위해 부장을 얻지 만, 전통적인 의미에서 고용이 아니다. 나는 perl과 python을 약간 알고있다. –

답변

0

장소의 일부를 주셔서 감사합니다 시간을 낭비하고 속도를 늦추는 코드는 다음과 같습니다.

문자열을 읽고 인자로 변환 한 다음 다시 문자열로 변환합니다. 두 전환을 피하는 방법에 대해서는 stringsAsFactors 인수가 read.table 인 것을보십시오.

colClassesread.table에 지정하여 속도를 높일 수 있으므로 각 열의 내용을 추측하는 데 시간을 낭비하지 않아도됩니다.

문자열을 수행 한 후에 rbind을 모두 함께 나눈 다음 결과 행렬 각각에서 1 개의 열만 사용하십시오. 첫 번째 ""다음에 번호 (또는 ""이 아닌 순서)를 잡는 것이 더 빠를 수도 있습니다. strapply 기능을 gsubfn 패키지에서 사용하거나 regexprregmatches 기능 만 사용할 수 있습니다.

cbind 함수를 사용하여 ld 행렬을 만드는 것은 matrix을 사용하여 연결 한 다음 재배치하는 것보다 빠를 수 있습니다. 실제로, 처음에 행렬을 만드는 이유는 2 개의 열을 사용하지 않고 나머지는 따로 사용합니다. 또한 숫자를 나중에 변환해야하는 문자로 변환합니다.

루프에서 as.numeric을 실행하면 비효율적입니다. 동일한 값을 반복해서 계속 변환하기 때문에 반복 전에 전체 행렬에 단일 as.numeric을 수행하십시오.

which이 작동하는 논리에 subscripting이 잘 작동하므로 which에 대한 호출이 필요하지 않습니다.

위의 내용을 수정하고 결과가 빨라지는 정도를 확인하십시오.

관련 문제