2016-06-01 10 views
0

Ich versuche, durch jede Zeile in einer Matrix zu iterieren, finden Sie die Spalte mit dem Mindestwert und den Spaltennamen und löschen Sie diese Spalte, nachdem es so verwendet wurde ein neues Minimum kann berechnet werden. Die richtige Antwort sollte wie folgt aussehen:R: Apply Familie, die Spalten als Teil der Funktion

result 
1/1 50 
2/2 61 
3/3 72 
4/4 83 

Test_Matrix <- matrix(c(50:149), ncol = 10 , byrow=FALSE) 
Names <- c(1:10) 
colnames(Test_Matrix) <- Names 
rownames(Test_Matrix) <- Names 


result <- t(sapply(seq(nrow(Test_Matrix)), function(i) { 
    j <- which.min(Test_Matrix[i,]) 
    c(paste(rownames(Test_Matrix)[i], colnames(Test_Matrix)[j], sep='/'), Test_Matrix[i,j]) 
    drops <- colnames(Test_Matrix)[j] 
    Test_Matrix[ , !(names(Test_Matrix) %in% drops)] 
})) 
result 

Zweite Frage ist, dass ich die Reihenfolge der Zeilen während der Iteration wählen möchten, so dass es in die nächste Zeile zu gehen, wählt, die den gleichen Namen wie die Kolonne hatte Name. Wenn die Spalte mit dem Minimum zum Beispiel 5 heißt, wird Spalte 5 gelöscht, und das Minimum für die Zeile mit dem Namen 5 wird als nächstes berechnet.

Fragen, ob dies möglich ist und ob für diese Berechnungen eine Schleife benötigt wird.

Als neuer R-Benutzer schätze ich jede Hilfe. Danke!

Antwort

1

Zum ersten Teil Ihrer Frage:

Test_Matrix <- matrix(c(50:149), ncol = 10 , byrow=FALSE) 
Names <- c(1:10) 
colnames(Test_Matrix) <- Names 
rownames(Test_Matrix) <- Names 

result <- matrix(nrow=0, ncol=2) 

for (i in 1:nrow(Test_Matrix)) { 
    Test_Matrix <- as.matrix(Test_Matrix) #when Test_Matrix has only 1 column R converts it into a vector 
    j <- which.min(Test_Matrix[i, ]) 
    result <- rbind(result, c(paste(rownames(Test_Matrix)[i], 
            colnames(Test_Matrix)[j], sep='/'), 
          as.numeric(Test_Matrix[i,j]))) 
    Test_Matrix <- Test_Matrix[, -j] #remove column j 
} 

result 
##  [,1] [,2] 
## [1,] "1/1" "50" 
## [2,] "2/2" "61" 
## [3,] "3/3" "72" 
## [4,] "4/4" "83" 
## [5,] "5/5" "94" 
## [6,] "6/6" "105" 
## [7,] "7/7" "116" 
## [8,] "8/8" "127" 
## [9,] "9/9" "138" 
##[10,] "10/" "149" 

Edit: Für den zweiten Teil anstelle der for Schleife, können Sie diese verwenden:

i <- 1 
while(length(Test_Matrix)>0) { 
    Test_Matrix <- as.matrix(Test_Matrix) 
    j <- which.min(Test_Matrix[i, ]) 
    result <- rbind(result, c(paste(rownames(Test_Matrix)[i], 
            colnames(Test_Matrix)[j], sep='/'), 
          as.numeric(Test_Matrix[i,j]))) 
    Test_Matrix <- Test_Matrix[, -j] 
    i <- as.numeric(names(j))+1 
} 
Verwandte Themen