R - 在不使用循环的情况下循环遍历不同的矩阵!帮助简单的代码

gia*_*iac 5 loops r matrix tapply

所以我有两个独立的矩阵(mat1和mat2),我需要仔细检查它们才能进行检查.我需要将结果存储到第三个矩阵中.

我觉得我的代码很长.

我想提出一些建议来避免循环.

所以我的第一个矩阵看起来像这样(dput到底)

  wit5.001 wit5.002 wit5.003 wit5.004 wit5.005 wit5.006 wit5.007 wit5.008 wit5.009 wit5.010
 [1,]        1        1        1        1        1        1        1            1        1        1
 [2,]        1        1        1        1        1        1        1        1        1        1
 [3,]        1        1        1        1        1        1        1        1        1        1
 [4,]        1        1        1        1        1        1        1        1        1        1
 [5,]        1        1        1        1        1        1        1        0        1        1
 [6,]        1        1        1        1        1        1        1        0        0        0
 [7,]        0        1        1        1        1        1        1        1        1        1
 [8,]        1        1        1        1        1        1        1        1        1        1
 [9,]        1        1        1        1        1        1        1        1        1        1
[10,]        1        1        1        1        1        1        1        1        1        1
Run Code Online (Sandbox Code Playgroud)

我的第二个矩阵具有类似的结构.

在这里,我创建了我的第三个矩阵 - 以便存储检查结果.

matCheck <- matrix('ok', ncol = ncol(mat1), nrow = nrow(mat1))
Run Code Online (Sandbox Code Playgroud)

这是我的循环 - 我想避免

for(j in 1:ncol(mat1)){
  for(i in 1:nrow(mat1)){

    if(mat1[i,j] == 1 & mat2[i,j] == 1) 
    {matCheck[i,j] <- 'ok'}  

    if(mat1[i,j] != 1 & mat2[i,j] == 1) 
    {matCheck[i,j] <- '!'}  

      }
   }
Run Code Online (Sandbox Code Playgroud)

检查结果

      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
 [1,] "ok" "ok" "ok" "ok" "ok" "ok" "ok" "ok" "ok" "ok" 
 [2,] "ok" "ok" "ok" "ok" "ok" "ok" "ok" "ok" "ok" "ok" 
 [3,] "ok" "ok" "ok" "ok" "ok" "ok" "ok" "ok" "ok" "ok" 
 [4,] "ok" "ok" "ok" "ok" "ok" "ok" "ok" "ok" "ok" "ok" 
 [5,] "ok" "ok" "ok" "ok" "ok" "ok" "ok" "ok" "ok" "ok" 
 [6,] "ok" "ok" "ok" "ok" "ok" "ok" "ok" "!"  "!"  "ok" 
 [7,] "!"  "ok" "ok" "ok" "ok" "ok" "ok" "ok" "ok" "ok" 
 [8,] "ok" "ok" "ok" "ok" "ok" "ok" "ok" "ok" "ok" "ok" 
 [9,] "ok" "ok" "ok" "ok" "ok" "ok" "ok" "ok" "ok" "ok" 
[10,] "ok" "ok" "ok" "ok" "ok" "ok" "ok" "ok" "ok" "ok" 
Run Code Online (Sandbox Code Playgroud)

有什么建议 ?

这是矩阵1

mat1 = structure(c(1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 
 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1), .Dim = c(10L, 
 10L), .Dimnames = list(NULL, c("wit5.001", "wit5.002", "wit5.003", 
"wit5.004", "wit5.005", "wit5.006", "wit5.007", "wit5.008", "wit5.009", 
"wit5.010")))
Run Code Online (Sandbox Code Playgroud)

这是矩阵2

mat2 = structure(c(1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 
1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 
1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 
0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 
0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0), .Dim = c(10L, 
10L), .Dimnames = list(NULL, c("wit5.020", "wit5.021", "wit5.022", 
"wit5.023", "wit5.024", "wit5.025", "wit5.026", "wit5.027", "wit5.028", 
"wit5.029")))
Run Code Online (Sandbox Code Playgroud)

Fra*_*ank 4

对于给出的示例,结果可以构造为

matCheck <- ( mat1 | !mat2 )
Run Code Online (Sandbox Code Playgroud)

这相当于初始化matCheck为 true,然后在 where 中填充 false !mat1 & mat2(如在 OP 的循环中)。括号是可选的,但使其更易于阅读(我认为)。