如何根据另一个矩阵的真/假指数替换矩阵中的值?

时间:2018-06-13 19:34:09

标签: r matrix indexing logical-operators

我一直试图在此矩阵中用0替换0以下的所有值:

vec.1 <- c(0, -1, -2, -1, 1, 0)
vec.2 <- c(-1, 0, -1.5, -2, 2, 1)
vec.3 <- c(-2, -1.5, 0, -1, 1, 2)
vec.4 <- c(-1, 0, -1, 0, 0, 1)
vec.5 <- c(1, 2, 1, 0, 0, -1)
vec.6 <- c(0, 1, 2, 1, -1, 0)

mat <- rbind(vec.1, vec.2, vec.3, vec.4, vec.5, vec.6, deparse.level = 0)

      [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    0 -1.0 -2.0   -1    1    0
[2,]   -1  0.0 -1.5   -2    2    1
[3,]   -2 -1.5  0.0   -1    1    2
[4,]   -1  0.0 -1.0    0    0    1
[5,]    1  2.0  1.0    0    0   -1
[6,]    0  1.0  2.0    1   -1    0    

我试过这段代码:

for((i in mat[]) < 0) {i = 0}

但它不起作用。我也尝试过:

matrix.positive <- mat < 0

      [,1]  [,2]  [,3]  [,4]  [,5]  [,6]
[1,] FALSE  TRUE  TRUE  TRUE FALSE FALSE
[2,]  TRUE FALSE  TRUE  TRUE FALSE FALSE
[3,]  TRUE  TRUE FALSE  TRUE FALSE FALSE
[4,]  TRUE FALSE  TRUE FALSE FALSE FALSE
[5,] FALSE FALSE FALSE FALSE FALSE  TRUE
[6,] FALSE FALSE FALSE FALSE  TRUE FALSE

mat[which(matrix.positive) = 0]

但它也不起作用(我确实意识到这没有多大意义,但我是R(和编码)的新手,所以我尝试了不同的方法)。如果没有等号和零,我得到这个向量:

 [1] -1.0 -2.0 -1.0 -1.0 -1.5 -2.0 -1.5 -1.0 -1.0 -2.0 -1.0 -1.0 -1.0

解决方案必须非常简单,但我无法解决。如果有人能帮助我,我将不胜感激。谢谢!

2 个答案:

答案 0 :(得分:3)

尝试pmax

pmax(mat, 0)

,并提供:

     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    0    0    0    0    1    0
[2,]    0    0    0    0    2    1
[3,]    0    0    0    0    1    2
[4,]    0    0    0    0    0    1
[5,]    1    2    1    0    0    0
[6,]    0    1    2    1    0    0

答案 1 :(得分:2)

我们可以使用replace将逻辑矩阵作为第二个参数,将替换值作为第三个参数

replace(mat, mat < 0, 0)
#     [,1] [,2] [,3] [,4] [,5] [,6]
#[1,]    0    0    0    0    1    0
#[2,]    0    0    0    0    2    1
#[3,]    0    0    0    0    1    2
#[4,]    0    0    0    0    0    1
#[5,]    1    2    1    0    0    0
#[6,]    0    1    2    1    0    0

或通过基于逻辑矩阵提取'mat'的值并将其赋值为0来使用赋值

mat[mat < 0] <- 0

因为它是一个数字matrix,算术也应该起作用

(mat >= 0) * mat