2015-05-07 2 views
6

Я новичок в R, это может быть глупый вопрос, но я не знаю, как его решить.как сохранить результат в списке из цикла for

У меня есть цикл for, который вернет возможно i * j непустые элементы.

Я хочу сохранить все непустые результаты в списке, но если я использую result[[i]]<-tmp в цикле, он может хранить только до i элементов, как я могу хранить все значения в списке? Благодарности

result<-list() 
    for (i in 1:nrow(m)){ 
    for (j in 1:i){ 
     if(m[i,j]!=0 && m[j,i]!=0){ 
     num=min(m[i,j],m[j,i]) 
     tmp=c(i,j,num) 
     result[[i]]<-tmp 
     } 
    } 
    } 

sample data 
set.seed(123) 
m= matrix(sample(0:5, size = 5*5, replace = TRUE), ncol = 5) 

Желаемый ответ

row col min 
[1] 1 1 1 
[1] 2 2 3 
[1] 3 1 2 
[1] 3 2 2 
[1] 3 3 4 
[1] 4 1 5 
[1] 4 2 1 
[1] 4 4 1 
[1] 5 1 5 
[1] 5 2 2 
[1] 5 4 5 
[1] 5 5 3 

Per Давида

pmin(mx[upper.tri(mx, diag = TRUE)], mx[lower.tri(mx, diag = TRUE)]) 

[1] 1 0 2 5 2 3 5 1 0 1 3 0 1 5 3 

возвращает

 > result 
[[1]] 
[1] 1 1 2 

[[2]] 
[1] 2 2 3 

[[3]] 
[1] 3 3 4 

[[4]] 
[1] 4 4 2 

[[5]] 
[1] 5 5 4 
+2

Для петель и растущих списков в R оба очень медленно. Можете ли вы переосмыслить свой алгоритм как функцию, применяемую к каждому элементу матрицы, и использовать 'apply()'? –

+1

Разве вы в основном не вычисляете 'pmin (m, t (m))'? –

+1

Я не уверен, что вы пытаетесь сделать и что именно не работает. Вам также не нужен такой большой набор данных, чтобы воспроизвести вашу проблему. Я думаю, что что-то вроде 'm = matrix (sample.int (5, size = 5 * 5, replace = TRUE), ncol = 5)' должно делать. Также используйте 'set.seed' и покажите, что вы ожидаете получить от своего цикла' for'. –

ответ

3

Вот что-то вроде @ DavidArenburg Ответим (конвертируется из комментария):

idx <- which(upper.tri(m,diag=TRUE),arr.ind=TRUE) 
v <- pmin(m[idx], m[idx[,2:1]]) 

cbind(idx,min=v)[v>0,] 

который дает

 row col min 
[1,] 1 1 1 
[2,] 2 2 3 
[3,] 1 3 2 
[4,] 2 3 2 
[5,] 3 3 4 
[6,] 1 4 5 
[7,] 2 4 1 
[8,] 4 4 1 
[9,] 1 5 5 
[10,] 2 5 2 
[11,] 4 5 5 
[12,] 5 5 3 
+1

Это очень мило. Я просто опубликовал аналогичный ответ, но это приятное использование 'which' намного лучше. Я шел с 'tm <- t (m); pmin (tm [upper.tri (tm, diag = TRUE)], m [upper.tri (m, diag = TRUE)]) ' –