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