[英]Replacing matrix elements indexed by another matrix
經過幾個小時的搜索,我轉向您的專業知識。 R 初學者,我嘗試加速我的代碼。 我的目標是替換矩陣A
的值。 但是,我想替換基於另一個矩陣B
兩個向量的值。 B[, 1]
是矩陣A
的第i
行的名稱。 第二列B[, 2]
對應於矩陣A
的列名。
我的代碼的第一個版本是在循環中使用 match 函數。
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
}
第二個版本讓我加快了一點速度:
for( k in 1:L) {
A[match(B[k,1],rownames(A)), match(B[k,2],colnames(A))] <- 0
}
但是,處理時間很長,太長了。 所以我想使用apply
函數。 為此,我必須在B
每一行向量中使用apply
。
使用apply
函數是個好方法嗎? 還是我走錯路了?
在我看來,你可以簡單地做A[B[, 1:2]] <- 0
,通過使用矩陣索引的力量。
例如, A[cbind(1:4, 1:4)] <- 0
將替換A[1,1]
、 A[2,2]
、 A[3,3]
和A[4,4]
為 0 . 事實上,如果A
有“dimnames”屬性(你指的“rownames”和“colnames”),我們也可以使用字符串作為索引。
可重現的例子
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.