繁体   English   中英

替换由另一个矩阵索引的矩阵元素

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM