2015-05-07 6 views
6

Ich bin neu in R, das kann eine dumme Frage sein, aber ich weiß nicht, wie ich es lösen soll.Wie man Ergebnis in einer Liste von einer For-Schleife speichern

Ich habe eine for-Schleife, die möglicherweise i * j nicht-leere Elemente zurückgibt.

Ich möchte alle nicht leeren Ergebnis in einer Liste speichern, aber wenn ich result[[i]]<-tmp in der Schleife verwenden, kann es nur bis zu i Elemente speichern, wie kann ich alle Werte in einer Liste speichern? Dank

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) 

Wunsch

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 Antwort

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 

kehrt

 > 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

Für Schleifen und wachsenden Listen in R sind beide sehr langsam gibt. Können Sie Ihren Algorithmus als eine Funktion über jedes Element der Matrix überdenken und 'apply()' verwenden? –

+1

Rechnen Sie nicht 'pmin (m, t (m))' '? –

+1

Ich bin mir nicht sicher, was Sie versuchen zu tun und was genau nicht funktioniert. Sie brauchen auch keinen so großen Datensatz, um Ihr Problem zu reproduzieren. Ich denke etwas wie m = matrix (sample.int (5, size = 5 * 5, ersetzen = TRUE), ncol = 5) sollte tun. Verwende auch 'set.seed' und zeige, was du von deiner' for'-Schleife erwartest. –

Antwort

3

Hier ist etwas wie @ DavidArenburg Antwort (von einem Kommentar umgewandelt):

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

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

die

 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

Das ist ein sehr netter. Ich habe gerade eine ähnliche Antwort gepostet, aber diese nette Verwendung von 'was' ist viel besser. Ich ging mit 'tm <- t (m); pmin (tm [obere.tri (tm, diag = WAHR)], m [obere.tri (m, diag = TRUE)]) ' –