我怎样才能加快我的R代码?

时间:2014-12-04 05:43:14

标签: r performance loops

我循环浏览一个名为geno.data的大字符矩阵。我基本上一次循环两列矩阵。它的运行速度非常慢。在循环结束时,我计划将EIGENSTRAT_genofile导出到.txt文件。我在程序的其余部分使用Xa。我怎样才能让它更快?感谢

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
}

1 个答案:

答案 0 :(得分: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) 列出所有元素:

{{1}}