2015-05-07 5 views
6

Sono nuovo di R, questa potrebbe essere una domanda stupida, ma non so come risolvere.come memorizzare il risultato nell'elenco da un ciclo for

Ho un ciclo for che restituirà probabilmente i * j elementi non vuoti.

Voglio memorizzare tutti i risultati non vuoti in un elenco, ma se uso result[[i]]<-tmp nel ciclo, è possibile memorizzare solo fino a i elementi, come posso memorizzare tutti i valori in un elenco? Grazie

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) 

desiderata risposta di

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 David

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 

rendimenti

 > 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

Per loop e crescono le liste in R sono entrambi molto lento. Puoi ripensare il tuo algoritmo come una funzione applicata su ogni elemento della matrice e usare 'apply()'? –

+1

Non stai praticamente calcolando 'pmin (m, t (m))'? –

+1

Non sono sicuro di cosa stai cercando di fare e cosa non funziona esattamente. Inoltre, non è necessario un set di dati così grande per riprodurre il problema. Penso che qualcosa come 'm = matrix (sample.int (5, size = 5 * 5, replace = TRUE), ncol = 5)' dovrebbe fare. Usa anche 'set.seed' e mostra cosa ti aspetti di ottenere dal ciclo' for'. –

risposta

3

Qui è qualcosa di simile @ di DavidArenburg risposta (convertito da un commento):

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

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

che dà

 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

È molto bello. Stavo solo postando una risposta simile, ma questo uso piacevole di 'which' è molto meglio. Stavo andando con 'tm <- t (m); pmin (tm [upper.tri (tm, diag = TRUE)], m [upper.tri (m, diag = TRUE)]) ' –