1

我正在尝试加快 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))})
)
4

2 回答 2

4

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

rowMeans(microarrayScores[mycombs[,1], ] ==
         microarrayScoresQC[mycombs[,2], ], na.rm = TRUE)
于 2013-07-03T22:20:02.613 回答
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 倍)

于 2013-07-03T22:04:18.137 回答