我创建了一个矩阵,想找到所有有" 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?
答案 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"