2016-12-07 4 views
2

나는 꽤 초보자 R을 사용하고있다. 그것은 나의 문제 다.래스터의 셀 값과이 래스터의 이전 셀을 어떻게 비교합니까? 이진 r

나는 많은 세포가있는 큰 래스터를 가지고있다. 이진 래스터이므로 0과 1이 있습니다. 전체 래스터를 살펴보고 0을 찾아야합니다. cell [i, j]가 0이면 4 개 이웃을 쌍으로보아야합니다.

작은 7x7 매트릭스로 시험해보고 싶었습니다. 그래서 그것이 있어야한다 무엇

nr3=0 
for (i in 1:7) 
    {for (j in 1:7) 
    {if (m[i,j]==0) 
     {if (m[i-1,j]!=0&&m[i,j-1]!=0) 
      {nr3++} 
     if (m[i-1,j]!=0&&m[i,j+1]!=0) 
      {nr3++} 
     if (m[i,j+1]!=0&&m[i+1,j]!=0) 
      {nr3++} 
     if (m[i+1,j]!=0&&m[i,j-1]!=0) 
      {nr3++} }}} 

: 내 생각

이 같은 루프를 사용하는 것이 었습니다. 이 오류가 있습니다.

Error in if (m[i-1,j]!=0&&m[i,j-1]!=0 {: missing value where TRUE/FALSE needed 

이 문제가 있습니다. 경계선에서 모든 이웃을 비교할 수는 없습니다. 내가

for (i in 2:6) 
for (j in 2:6) 

로 근무 것을 시도하는 이유 때문이다. 그러나 문제는 일부가 빠져 있다는 것입니다.

그럼 어떻게해야합니까? 그런데이 작업을 해결할 다른 가능성이 있기를 바랍니다. 아마 루프가 필요하지 않을까요? 나는 이것이 매우 큰 래스터를위한 아주 좋은 해결책이 아니라는 것을 이미지 할 수있다. 누구나 아이디어가 있습니까?

+0

당신이 무슨 뜻인지 명확히해야 당신이 그들을보고있는 것을 ... "그 네 이웃에 페어를 볼 필요가?" 당신은 어떤 결과물을 기대합니까? 코드에서 의도를 찾아내는 것보다는 말로 표현하는 것이 낫습니다. – jbaums

답변

0

raster 라이브러리를 사용하십시오. 이것은 당신의 루프 방식보다 더 빨리해야한다 :

더미 매트릭스

library(raster) 

    #create a dummy raster 
    m <- raster(matrix(c(0,1,1,0,0,1,0,1,0), nrow=3)) 

    > as.matrix(m) 
    [,1] [,2] [,3] 
[1,] 0 0 0 
[2,] 1 0 1 
[3,] 1 1 0 

네 이웃

#define the size of your moving window (focal) 
f <- matrix(c(0,1,0,1,1,1,0,1,0), nrow=3) 

사용 기능 래스터 :: 초점

초점 창 쌍 비교를 위해 차 <<- 할당 :

nr3 <- 0 

    focal(m, 
     w = f, 
     pad = T, 
     padValue = 0, 
     fun = function(x){ 
       #x[5] corresponds to the center pixel in the moving window 
       if(x[5]==0){ 

        #x[2],x[4],x[6] and x[8] are the four neighbours 
        if(x[2]!=0 & x[4]!=0){ 
        nr3 <<- nr3 + 1 
        } 
        if(x[8]!=0 & x[4]!=0){ 
        nr3 <<- nr3 + 1 
        } 
        if(x[8]!=0 & x[6]!=0){ 
        nr3 <<- nr3 + 1 
        } 
        if(x[2]!=0 & x[6]!=0){ 
        nr3 <<- nr3 + 1 
        } 
       } 
     } 
    ) 

출력 :

> nr3 
[1] 3 

참고 : 당신은 기능 환경 외부 변수를 수정할 수 있도록 여기에 <<- 할당을 사용해야합니다. Hadley을 인용 :

The regular assignment arrow, <- , always creates a variable in the current environment. The deep assignment arrow, <<- , never creates a variable in the current environment, but instead modifies an existing variable found by walking up the parent environments.