2014-12-04 5 views
-1

Я прохожу через большую матрицу символов, называемую geno.data. Я по существу зацикливаю два столбца матрицы за раз. Он работает очень медленно. В конце цикла я планирую экспортировать EIGENSTRAT_genofile в файл .txt. Я использую Xa в остальной части программы. Как я могу сделать это быстрее? БлагодаряКак я могу ускорить мой R-код?

geno.data <- matrix(nrow = 313, ncol = 300000, c("a","c","g")) # large matrix 
Num_of_SNPs<-ncol(geno.data) /2 

compute_MAF<- function(j){ 
    loci<- NULL 
    loci<- table(as.vector(geno.data[,c(2*j-1,2*j)])) 
    total_alleles<- sum(loci) 
    loci<- loci/total_alleles 

    # major and minor allele frequencies for one locus 
    major_allele<- names(which.max(loci)) 
    minor_allele<- names(which.min(loci)) 

    return(cbind(major_allele, minor_allele)) 
} 

Xa <- matrix(NA, nrow = nrow(geno.data), ncol = Num_of_SNPs) 
EIGENSTRAT_genofile<-c() 

for (j in 1:Num_of_SNPs){ 
    allele<-compute_MAF(j) 
    X <- 1 * (geno.data[,c(2*j-1, 2*j)] == allele[2]) # minor allele 
    reference_allele_count <- rowSums(geno.data[,c(2*j-1,2*j)]==allele[1], na.rm=TRUE) 
    EIGENSTRAT_genofile<- rbind(EIGENSTRAT_genofile,reference_allele_count) 
    Xa[,j] <- X[,1] + X[,2] - 1 
} 
+0

Посмотрите на пакет doParallel. если на вашем компьютере имеется несколько ядер, вы можете значительно повысить скорость. – Jason

ответ

1

Хотя есть улучшения, которые могут быть сделаны по всему вашему коду, самое узкое представлено:

EIGENSTRAT_genofile<- rbind(EIGENSTRAT_genofile,reference_allele_count) 

Вы всегда должны избегать выращивания объектов внутри цикла. Скорее всего, пытаться инициализировать список перед циклом:

EIGENSTRAT_genofile<-vector("list",Num_of_SNPs) 

Внутри цикла, вы можете назначить reference_allele_count к элементу EIGENSTRAT_genofile:

EIGENSTRAT_genofile[[j]]<-reference_allele_count 

Затем, в конце после цикла, вы rbind все элементы списка вместе через do.call:

EIGENSTRAT_genofile<-do.call(rbind, EIGENSTRAT_genofile) 
+0

, который сделал трюк. Оригинал работал на удаленном сервере более 5 часов. Я внес свои исправления, мне потребовалось полторы минуты на моем ноутбуке. Вы видите какие-либо другие узкие места или улучшения, которые я могу сделать, чтобы заставить его работать еще быстрее? – cooldood3490

+0

В 'compute_MAF' нет причин для нормализации таблицы, так как вы просто ищете min и max. Затем используйте 'c' вместо' cbind' в возвращаемом значении. Вместо списка (как я предложил в своем ответе) вы можете инициализировать матрицу (я не проверял ваш код и не знаю, возможно ли это) и заполнять каждую строку в цикле. Это не будет столь масштабным улучшением, как трюк в ответе, но все же стоит сделать снимок. – nicola

Смежные вопросы