如何用另一个矩阵更新矩阵的值?

时间:2013-08-08 10:12:45

标签: r matrix

我有2个矩阵:m1m2

M1:

    1   2   3   4   5
1  v11 v12 v13 v14 v15
2  v21 v22 v23 v24 v25
3  v31 v32 v33 v34 v35 
4  v41 v42 v43 v44 v45
5  v51 v52 v53 v54 v55

平方米:

 x1, x2, val
 1   2    v1
 2   3    v2
 2   5    v3

如果在m1中找到了rowname和colname,我想更新m2

e.g。新值v12<-v12-v1和新值v23<-v23-v2

到目前为止,我尝试使用:

m1[rownames(m1) %in% m2$x1 & colnames(m1) %in% m2$x2]

apply(m1, c(1,2), function(x)

我做不到。

1 个答案:

答案 0 :(得分:0)

使用match将行名和列名转换为索引,删除不匹配,然后使用矩阵索引进行替换:

一些示例数据:

set.seed(123)
m1 <- matrix(runif(25), 5, 5)
rownames(m1) <- paste0("r", 1:5)
colnames(m1) <- paste0("c", 1:5)
m1
#           c1        c2        c3         c4        c5
# r1 0.2875775 0.0455565 0.9568333 0.89982497 0.8895393
# r2 0.7883051 0.5281055 0.4533342 0.24608773 0.6928034
# r3 0.4089769 0.8924190 0.6775706 0.04205953 0.6405068
# r4 0.8830174 0.5514350 0.5726334 0.32792072 0.9942698
# r5 0.9404673 0.4566147 0.1029247 0.95450365 0.6557058

m2 <- data.frame(x1  = c("r1", "r3", "r100"),
                 x2  = c("c2", "c3", "c5"),
                 val = c(1, 2, 3))
m2
#     x1 x2 val
# 1   r1 c2   1
# 2   r3 c3   2
# 3 r100 c5   3

i1 <- match(m2$x1, rownames(m1))
i2 <- match(m2$x2, colnames(m1))
k  <- !(is.na(i1) | is.na(i2))

m1[cbind(i1[k], i2[k])] <- m2$val[k]
m1
#           c1        c2        c3         c4        c5
# r1 0.2875775 *1.0000000* 0.9568333  0.89982497 0.8895393
# r2 0.7883051  0.5281055  0.4533342  0.24608773 0.6928034
# r3 0.4089769  0.8924190 *2.0000000* 0.04205953 0.6405068
# r4 0.8830174  0.5514350  0.5726334  0.32792072 0.9942698
# r5 0.9404673  0.4566147  0.1029247  0.95450365 0.6557058