2013-03-15 135 views
1

我想要使用apply/mapply/lapply/sapply或任何其他方式向量化我的嵌套for循環代碼以減少運行時間。我的代碼如下:向量化嵌套for循環

for (i in 1:dim){ 
for (j in i:dim){ 
    if(mydist.fake[i,j] != d.hat.fake[i,j]){ 
    if((mydist.fake[i,j]/d.hat.fake[i,j] > 1.5)|(d.hat.fake[i,j]/mydist.fake[i,j]>1.5)){ 
     data1 = cbind(rowNames[i],rowNames[j], mydist.fake[i,j], d.hat.fake[i,j], 1) 
     colnames(data1) = NULL 
     row.names(data1) = NULL 
     data = rbind(data, data1) 
    }else{ 
     data1 = cbind(rowNames[i],rowNames[j], mydist.fake[i,j], d.hat.fake[i,j], 0) 
     colnames(data1) = NULL 
     row.names(data1) = NULL 
     data = rbind(data, data1) 
     } 
     } 
    } 
    } 
write.table(data, file = "fakeTest.txt", sep ="\t", col.names = FALSE, row.names = FALSE) 
  • rowNames是所有數據點
  • data的rownames的載體是數據幀
  • mydist.faked.hat.fake是距離矩陣(其中對角是零和的值上下三角相同),因此對下三角的橫向感興趣(對角線也留下值)。
  • 這兩個矩陣的尺寸是相同的。

我現在面臨的主要問題是j的循環,j被初始化爲i的矢量。

+2

歡迎堆棧溢出。 [可重複使用的例子](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)是要走的路。在你的例子中是什麼'rowNames'? – mnel 2013-03-15 03:40:52

+1

真的需要這樣的問題的樣本數據。 – 2013-03-15 04:07:27

回答

8

代碼的向量化版本是:

dist1 <- mydist.fake 
dist2 <- d.hat.fake 

data <- data.frame(i = rowNames[row(dist1)[lower.tri(dist1)]], 
        j = rowNames[col(dist1)[lower.tri(dist1)]], 
        d1 = dist1[lower.tri(dist1)], 
        d2 = dist2[lower.tri(dist2)]) 

data <- transform(data, outcome = d1/d2 > 1.5 | d2/d1 > 1.5) 

我測試了它成功地使用下面的示例數據:

X   <- matrix(runif(200), 20, 10) 
Y   <- matrix(runif(200), 20, 10) 
rowNames <- paste0("var", seq_len(nrow(X))) 
mydist.fake <- as.matrix(dist(X)) 
d.hat.fake <- as.matrix(dist(Y)) 
+0

非常感謝..這是快速和真棒.. atleast今天學到了東西..再次感謝! – snape 2013-03-15 04:40:05