2016-10-01 231 views
2

经过几个小时的搜索后,我转向了您的专业知识。 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函数的一个好方法吗?或者我走错了路?

回答

3

在我看来,你可以简单地做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