如何使用条件如果在R中更改矩阵条目

MK *_*uda 13 if-statement r matrix conditional-statements multiple-entries

我有这个示例矩阵,我想使用"YES""NO"基于条件if语句更改矩阵的条目。

a<-c(5,1,0,3,2,0.6,1.6,7,9,0)
b<-c(11,0,1,18,11,11,0,13,20,10)
c<-c(10,20,0.7,0.8,0.3,0.4,0,0.9,1,1)

MAT<-cbind(a,b,c)
MAT

for (i in 1:nrow(MAT)){
  for (j in 1:ncol(MAT)){
  if (MAT[i,j]>5){
    MAT[i,j]="YES"
    } else {
    MAT[i,j]="NO"
    }
  }
}
print(MAT)
Run Code Online (Sandbox Code Playgroud)

我得到的输出是这样的,它是错误的。请帮助告诉我出了什么问题以及如何解决?

      a     b    c   
[1,] "NO"  "NO" "NO"
[2,] "NO"  "NO" "NO"
[3,] "NO"  "NO" "NO"
[4,] "NO"  "NO" "NO"
[5,] "NO"  "NO" "NO"
[6,] "NO"  "NO" "NO"
[7,] "NO"  "NO" "NO"
[8,] "YES" "NO" "NO"
[9,] "YES" "NO" "NO"
[10,] "NO"  "NO" "NO"
Run Code Online (Sandbox Code Playgroud)

Gue*_*sBF 16

这里不需要循环。只需在调用中使用整个矩阵x>5

ifelse(MAT>5, "YES", "NO")
Run Code Online (Sandbox Code Playgroud)

这将对整个矩阵进行逻辑运算。然而,输出将是一个向量,它基本上是结果逻辑矩阵,但从其dim属性中剥离。

您可以重新分配VALUES的输出ifelse(),同时保持STRUCTUREMAT使用空方括号[],如:

MAT[]<-ifelse(MAT>5, "YES", "NO")
Run Code Online (Sandbox Code Playgroud)


Tho*_*ing 11

失败原因

你尝试失败的原因来自这部分:

  if (MAT[i,j]>5){
    MAT[i,j]="YES"
    } else {
    MAT[i,j]="NO"
    }
  }
Run Code Online (Sandbox Code Playgroud)

您应该知道这MAT是数字,但是您正在将字符分配给MATwith inif...else...语句,这将MAT转换为字符矩阵。在这种情况下,当您运行时MAT[i,j] > 5,您将一个字符与一个数值进行比较,例如,"18" > 5返回一个不需要的FALSE.


解决方法

解决方法是使用另一个变量来存储 之后的值if...else...,而不是替换 中的值MAT

a <- c(5, 1, 0, 3, 2, 0.6, 1.6, 7, 9, 0)
b <- c(11, 0, 1, 18, 11, 11, 0, 13, 20, 10)
c <- c(10, 20, 0.7, 0.8, 0.3, 0.4, 0, 0.9, 1, 1)

MAT <- cbind(a, b, c)
out <- MAT

for (i in 1:nrow(MAT)) {
  for (j in 1:ncol(MAT)) {
    if (MAT[i, j] > 5) {
      out[i, j] <- "YES"
    } else {
      out[i, j] <- "NO"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

以至于

> out
      a     b     c
 [1,] "NO"  "YES" "YES"
 [2,] "NO"  "NO"  "YES"
 [3,] "NO"  "NO"  "NO"
 [4,] "NO"  "YES" "NO"
 [5,] "NO"  "YES" "NO"
 [6,] "NO"  "YES" "NO"
 [7,] "NO"  "NO"  "NO"
 [8,] "YES" "YES" "NO"
 [9,] "YES" "YES" "NO"
[10,] "NO"  "YES" "NO"
Run Code Online (Sandbox Code Playgroud)

选择

这个问题已经有很多答案了,下面是另一个基本的 R 选项

> `dim<-`(as.character(factor(MAT > 5, labels = c("NO", "YES"))), dim(MAT))
      [,1]  [,2]  [,3]
 [1,] "NO"  "YES" "YES"
 [2,] "NO"  "NO"  "YES"
 [3,] "NO"  "NO"  "NO"
 [4,] "NO"  "YES" "NO"
 [5,] "NO"  "YES" "NO"
 [6,] "NO"  "YES" "NO"
 [7,] "NO"  "NO"  "NO"
 [8,] "YES" "YES" "NO"
 [9,] "YES" "YES" "NO"
[10,] "NO"  "YES" "NO"
Run Code Online (Sandbox Code Playgroud)

  • 作为替代方案,也可以编写 `structure(as.character(...), dim = dim(MAT))` 或 `array(as.character(...), dim = dim(MAT))` . (2认同)

akr*_*run 5

仅使用转换为数字索引的逻辑矩阵

MAT[] <- c("NO", "YES")[1 + (MAT > 5)]
Run Code Online (Sandbox Code Playgroud)

-输出

> MAT
      a     b     c    
 [1,] "NO"  "YES" "YES"
 [2,] "NO"  "NO"  "YES"
 [3,] "NO"  "NO"  "NO" 
 [4,] "NO"  "YES" "NO" 
 [5,] "NO"  "YES" "NO" 
 [6,] "NO"  "YES" "NO" 
 [7,] "NO"  "NO"  "NO" 
 [8,] "YES" "YES" "NO" 
 [9,] "YES" "YES" "NO" 
[10,] "NO"  "YES" "NO" 
Run Code Online (Sandbox Code Playgroud)