用另一个矩阵中的值替换一个矩阵中的值

时间:2019-07-03 17:14:46

标签: r matrix comparison

我正在尝试与矩阵进行比较。当这些值不相等时,我想使用mat2中的值,只要它大于0即可;如果它是零,那么我想要mat1中的值。就目前的代码而言,它似乎不断返回mat1的值。

这是我的尝试:

mat.data1 <- c(1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1)
mat1 <- matrix(data = mat.data1, nrow = 5, ncol = 5, byrow = TRUE)


mat.data2 <- c(0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 1, 2, 2, 0, 0, 0, 1, 2, 2, 0, 2, 1, 0, 1)
mat2 <- matrix(data = mat.data2, nrow = 5, ncol = 5, byrow = TRUE)

mat3 = if(mat1 == mat2){mat1} else {if(mat2>0){mat2} else {mat1}}

预期输出应为

1   0   1   1   1
0   1   2   1   1
1   1   2   2   0
1   1   1   2   2
1   1   1   0   1

2 个答案:

答案 0 :(得分:2)

我们可以使用coalesce

library(dplyr)
out <- coalesce(replace(mat2, !mat2, NA), replace(mat1, !mat1, NA))    
replace(out, is.na(out), 0)

或者如@Axeman所述

coalesce(out, 0)

答案 1 :(得分:2)

这是一种可行的方法。

mat.data1 <- c(1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1)
mat1 <- matrix(data = mat.data1, nrow = 5, ncol = 5, byrow = TRUE)


mat.data2 <- c(0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 1, 2, 2, 0, 0, 0, 1, 2, 2, 0, 2, 1, 0, 1)
mat2 <- matrix(data = mat.data2, nrow = 5, ncol = 5, byrow = TRUE)


mat3 <- mat1
to_change <- which(mat2 != mat1 & mat2 > 0)
mat3[to_change] <- mat2[to_change]

which的这种特定用法实质上要求mat2中的位置与mat1中的位置不相等,并且其中mat2大于零。然后,您可以做一个子集并将这些值放在mat3中。

然后输出如下:

> mat3
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    0    1    1    1
[2,]    0    1    2    1    1
[3,]    1    1    2    2    0
[4,]    1    1    1    2    2
[5,]    1    2    1    0    1