2016-10-01 4 views
2

Nach mehreren Stunden der Suche, wende ich mich an Ihr Fachwissen. Anfänger in R versuche ich meinen Code zu beschleunigen. Mein Ziel ist es, die Werte in einer Matrix A zu ersetzen. Ich möchte jedoch Werte basierend auf zwei Vektoren einer anderen Matrix B ersetzen. B[, 1] ist der Name der Zeile i der Matrix A. Die zweite Spalte B[, 2] entspricht dem Namen der Spalte der Matrix A.Matrixelemente durch eine andere Matrix ersetzen

Die erste Version meines Codes war die Match-Funktion in einer Schleife zu verwenden.

for(k in 1:L){ 
    i <- B[k,1] 
    j <- B[k,2] 
    d <- match(i,rownames(A)) 
    e <- match(j,colnames(A)) 
    A[d, e] <- 0 
    } 

Die zweite Version erlaubt mir ein wenig zu beschleunigen:

for(k in 1:L) { 
    A[match(B[k,1],rownames(A)), match(B[k,2],colnames(A))] <- 0 
    } 

die Bearbeitungszeit ist jedoch lang, zu lang. Also dachte ich mir, die apply Funktion zu verwenden. Dazu muss ich apply in jeder Reihe Vektoren von B verwenden.

Funktioniert die Verwendung von apply ein guter Weg? Oder ich gehe in die falsche Richtung?

Antwort

3

Es scheint mir, dass Sie einfach A[B[, 1:2]] <- 0 tun können, indem Sie die Macht der Matrixindizierung verwenden.

Zum Beispiel wird A[cbind(1:4, 1:4)] <- 0 ersetzen A[1,1], A[2,2], A[3,3] und A[4,4] auf 0. In der Tat, wenn A hat "dimnames" Attribute (die "rownames" und "COLNAMES" Sie beziehen sich auf), können wir auch den Charakter verwenden Zeichenfolgen als Index.


Reproduzierbare Beispiel

A <- matrix(1:16, 4, 4, dimnames = list(letters[1:4], LETTERS[1:4])) 
# A B C D 
#a 1 5 9 13 
#b 2 6 10 14 
#c 3 7 11 15 
#d 4 8 12 16 

set.seed(0); B <- cbind(sample(letters[1:4])), sample(LETTERS[1:4])) 
#  [,1] [,2] 
#[1,] "d" "D" 
#[2,] "a" "A" 
#[3,] "c" "B" 
#[4,] "b" "C" 

## since `B` has just 2 columns, we can use `B` rather than `B[, 1:2]` 
A[B] <- 0 

# A B C D 
#a 0 5 9 13 
#b 2 6 0 14 
#c 3 0 11 15 
#d 4 8 12 0 
Verwandte Themen