1

apply/ mapply/ lapply/sapplyまたは実行時間を短縮する他の方法を使用して、ネストされた 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データフレームです
  • mydist.faked.hat.fakeは距離行列 (対角線がゼロで、上三角と下三角の値が同じ) であるため、下三角の横断に関心があります (対角線の値も残します)。
  • 両方の行列の次元は同じです。

私が直面している主な問題は、として初期化されるjループのベクトル化です。ji

4

1 に答える 1

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))
于 2013-03-15T03:54:44.797 に答える