如何根据另一个矩阵的 true/false 索引替换矩阵中的值?
How to replace values in matrix based on true/false indices of another matrix?
我一直在尝试用这个矩阵中的 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
解决方案一定很简单,但我无法解决。如果有人能帮助我,我将不胜感激。谢谢!
尝试 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
我们可以使用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
我一直在尝试用这个矩阵中的 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
解决方案一定很简单,但我无法解决。如果有人能帮助我,我将不胜感激。谢谢!
尝试 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
我们可以使用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