替换由另一个矩阵索引的矩阵元素
Replacing matrix elements indexed by another matrix
经过几个小时的搜索,我求助于您的专业知识。 R 初学者,我尝试加快我的代码。我的目标是替换矩阵 A
中的值。但是,我想根据另一个矩阵 B
的两个向量替换值。 B[, 1]
是矩阵 A
的行 i
的名称。第二列,B[, 2]
对应矩阵的列名A
.
我的代码的第一个版本是在循环中使用匹配函数。
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
经过几个小时的搜索,我求助于您的专业知识。 R 初学者,我尝试加快我的代码。我的目标是替换矩阵 A
中的值。但是,我想根据另一个矩阵 B
的两个向量替换值。 B[, 1]
是矩阵 A
的行 i
的名称。第二列,B[, 2]
对应矩阵的列名A
.
我的代码的第一个版本是在循环中使用匹配函数。
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