2013-03-15 4 views
1

Я пытаюсь векторизовать свой вложенный код цикла, используя apply/mapply/lapply/sapply или любым другим способом уменьшить время работы. Мой код выглядит следующим образом:Векторизация вложенных для циклов

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 является вектором rownames всех точек данных
  • data является dataframe
  • mydist.fake и d.hat.fake ARE расстояние матрицы (где диагональ равна нулю, а значения верхний и нижний треугольники одинаковы), и поэтому они заинтересованы в трансверсале нижнего треугольника (оставляя значения диагоналей тоже).
  • Размеры обеих матриц одинаковы.

Основная проблема я столкнулся это векторизации j цикла, где j инициализируется как i.

+2

Добро пожаловать к переполнению стека. [Воспроизводимые примеры] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) - это путь. Что такое 'rowNames' в вашем примере ?. – mnel

+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)) 
+0

Спасибо большое .. это было быстро и удивительно .. atleast узнал что-то сегодня .. еще раз спасибо! – snape

Смежные вопросы