R - 检查可能滞后的不同矩阵

R - Check different matrices with a possible lag

这个问题很难解释,但我相信你们中的一些人已经遇到过它。

所以我有两个矩阵。 矩阵 1 (mat 1) 和 矩阵 2 (mat 2)

我想做的是在检查矩阵 1 后,在第三个矩阵 (mat3) 中记录 mat2 的值,但有滞后。让我解释。

在矩阵1中的值1之后,我想检查矩阵2是否也是1但在a的范围内某些 LAG,例如(列)之后的 1 或 2 集。

例如,行号 4 在第 6 列的矩阵 1 中有一个 1。 所以我想检查矩阵 2 中第 4 行是否有 1 直接在 2 或 3 列之后或之后。

你明白这个想法了吗?

mat1 = structure(c(0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 
0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 
0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 
1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 
0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 
0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1), .Dim = c(10L, 21L), .Dimnames = list(NULL, c("wit5.020", 
"wit5.021", "wit5.022", "wit5.023", "wit5.024", "wit5.025", "wit5.026", 
"wit5.027", "wit5.028", "wit5.029", "wit5.030", "wit5.031", "wit5.032", 
"wit5.033", "wit5.034", "wit5.035", "wit5.036", "wit5.037", "wit5.038", 
"wit5.039", "wit5.040")))

mat2 = structure(c(0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 
0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 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, 1, 0, 0, 
0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 
0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 
1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 
0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 1, 0, 
1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 
0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 
0, 1, 0, 1), .Dim = c(10L, 21L))

所以 mat3 - 我想存储检查结果的地方

mat3 = matrix(0, nrow = nrow(mat1), ncol = ncol(mat1))

所以这是一个可能循环的例子 为了检查 LAG - 这个 循环不起作用 但它可能会给你一个解决方案的想法。 我不确定在哪里引入滞后。我想也许在 i 中,但我不确定。

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

    if( mat1[i,j] == 1 & mat2[i,j] == 1 | mat2[i+1,j] == 1 | mat2[i+2,j] == 1) # lag here 
    {mat[i,j] <- 1}  

else
{mat[i,j] <- 0}  

  }
}

非常欢迎任何想法。

这是一个简单的方法:

lag <- 3  # or whatever lag you want
nr <- nrow(mat1)
nc <- ncol(mat1)

mat3 <- matrix(0, ncol=nc, nrow=nr)
for (r in 1:nr) {
  for (c in 1:nc) {
    if (mat1[r,c] == 1 && any(mat2[r,c:min(c+lag,nc)] == 1))
      mat3[r,c] <- 1
  }
}

注意 mat2[r,c:min(c+lag,nc)] 的用法。这会选择从当前列 c 到列 c + lag 的所有元素,但它确保不会超过 nc(总列数)。即这段代码是用来避免越界错误的。

可能有一种更快、更向量化的方法来执行此操作,但上面的代码应该可以工作。