2013-07-03 49 views
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))}) 
) 
+0

可以提供'chipScores'和'chipScoresQC'? – flodel

+0

編輯。它應該說'microarrayScores'和'microarrayScoresQC'。 – cylondude

+0

還有一個問題:你確定你打算比較微陣列分析而不是列? – joran

回答

4

這裏是你的代碼的向量化版本,大約快20倍我的機器上:

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

_很好。我永遠都看不到。 – joran

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倍)

+0

謝謝你忍受混亂的古蘭經。你有什麼資源來了解爲什麼這會更快? – cylondude

+0

@cyclondude我只是困惑於「爲什麼」我自己。具體來說,我正在思考,如果可能''[''比'更大的矩陣'mycombs'更快地處理'foo'中小得多的兩個元素向量'x'。 'sapply'和'apply'之間的區別也可能會使後者更適合這種特殊情況。 – joran

+0

@cyclondude另外,我不會很快接受我的回答。等一會兒,你可能會吸引其他一些人來做這件事,這可能會帶來更好的效果。我只沉浸了幾分鐘的努力。 – joran