显示匹配元素周围的矩阵值

时间:2018-04-01 08:51:51

标签: r matrix indexing match which

我创建了一个矩阵,想找到所有有" 1"的地方,然后将所有4个相邻的单元格更改为一个字符或数字,比如一个句号(" 。")或2号。

我可以获得我想要的4个阵列,即相邻的单元格到" 1" s的位置。但是我不知道如何返回它们然后在不使用一行一行的每个4个数组的极长循环的情况下更改它们。

e.g。我有一个矩阵

Y<-matrix(c(1,0,0,0,0,0,1,0,1,0,1,0,0,0,1,1),byrow=TRUE,ncol=4)
Y
      [,1] [,2] [,3] [,4]
[1,]    1    0    0    0
[2,]    0    0    1    0
[3,]    1    0    1    0
[4,]    0    0    1    1

我想最终:

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

所以,为了得到我想放置2s的所有位置:

Y1<-which(Y==1,arr.ind=TRUE)
a1<-t(rbind(Y1[,1][Y1[,1]-1>0]-1,Y1[,2][Y1[,1]-1>0]))
a2<-t(rbind(Y1[,1][Y1[,1]+1<=R]+1,Y1[,2][Y1[,1]+1<=R]))
b1<-t(rbind(Y1[,1][Y1[,2]-1>0],Y1[,2][Y1[,2]-1>0]-1))
b2<-t(rbind(Y1[,1][Y1[,2]+1<=C],Y1[,2][Y1[,2]+1<=C]+1))

> Y1
     row col
[1,]   1   1
[2,]   3   1
[3,]   2   3
[4,]   3   3
[5,]   4   3
[6,]   4   4

因此,例如,我希望所有索引(行和列)都是一个索引,低于所有1:

> a1
      row  col
[1,]    2    1
[2,]    1    3
[3,]    2    3
[4,]    3    3
[5,]    3    4

如何在矩阵Y中找到所有这些位置并用其他值替换那些位置但是保留所有1?

1 个答案:

答案 0 :(得分:0)

我想我明白了。非常简单,只需使用哪个函数,并在所需点之上/之下直接添加/减去n。并且为所需点的左/右位置添加/减去n + nrow。 e.g。

> M<-matrix(c(2,2,2,2,1,1,2,2,2,2,1,1,2,2,2,2,2,2,2,1,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2),nrow=6,ncol=7)
> M
     [,1] [,2] [,3] [,4] [,5] [,6] [,7]
[1,]    2    2    2    2    2    2    2
[2,]    2    2    2    1    2    2    2
[3,]    2    2    2    2    1    2    2
[4,]    2    2    2    2    2    2    2
[5,]    1    1    2    2    2    2    2
[6,]    1    1    2    2    2    2    2

l<-length(which(M==1))

if(l>0){
    l1<-which(M==1)-nrow(M); l1<-l1[l1>0]
    r1<-which(M==1)+nrow(M); r1<-r1[r1<=prod(dim(M))]
    u1<-which(M==1)[which(M==1)%%nrow(M)!=1]-1
    d1<-which(M==1)[which(M==1)%%nrow(M)!=0]+1

    M[l1][which(M[l1]!=1)]<-"."
    M[r1][which(M[r1]!=1)]<-"."
    M[u1][which(M[u1]!=1)]<-"."
    M[d1][which(M[d1]!=1)]<-"."
  }
M<-replace(M,which(M==1,arr.ind=TRUE),".")

> M
    [,1] [,2] [,3] [,4] [,5] [,6] [,7]
[1,] "2"  "2"  "2"  "."  "2"  "2"  "2" 
[2,] "2"  "2"  "."  "."  "."  "2"  "2" 
[3,] "2"  "2"  "2"  "."  "."  "."  "2" 
[4,] "."  "."  "2"  "2"  "."  "2"  "2" 
[5,] "."  "."  "."  "2"  "2"  "2"  "2" 
[6,] "."  "."  "."  "2"  "2"  "2"  "2"