如何加快交叉检查样品的速度?

时间:2013-07-03 21:39:20

标签: r plyr

我正在尝试加快QC功能以检查样本之间的相似性。我想知道是否有更快的方式来比较我在下面的方式?我知道有这样一个问题的答案是非常确定的(在SO或其他方面),但我找不到它们。我知道我应该调查plyr,但我仍然抓住sapply

以下示例数据是我将要工作但随机化的代表性输出,我认为这不会影响我原始问题的应用程序。

## sample data 
nSamples <- 1000
nSamplesQC <- 100
nAssays <- 96
microarrayScores   <- matrix(sample(c("G:G", "T:G", "T:T", NA),nSamples * nAssays,replace = TRUE), nrow = nSamples, ncol = nAssays) 
microarrayScoresQC <- matrix(sample(c("G:G", "T:G", "T:T", NA),nSamples * nAssays,replace = TRUE), nrow = nSamples, ncol = nAssays)
mycombs <- data.frame(Experiment = rep(1:nSamples,nSamplesQC),QC = sort(rep(1:nSamplesQC,nSamples)))

## testing function
system.time(
sapply(seq(length(mycombs[,1])), function(x) {compare <- microarrayScores[mycombs[x,1],]==microarrayScoresQC[mycombs[x,2],];
                                              sum(compare[!is.na(compare)])/sum(!is.na(compare))})
)

2 个答案:

答案 0 :(得分:4)

以下是代码的矢量化版本,在我的机器上快了大约20倍:

rowMeans(microarrayScores[mycombs[,1], ] ==
         microarrayScoresQC[mycombs[,2], ], na.rm = TRUE)

答案 1 :(得分:3)

这样的事情:

foo <- function(x){
    compare <- microarrayScores[x[1],]==microarrayScoresQC[x[2],]
    sum(compare[!is.na(compare)])/sum(!is.na(compare))
}

system.time(apply(mycombs,1,foo))

看起来速度要快一些。 (也许2-3倍)