2016-12-07 50 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

你应该清楚你的意思是什么“需要在其4个邻国寻找配对” ..什么是你在看他们?你期望输出什么?最好用文字说明,而不是让我们从你的代码中找出你的意图。 – 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 

与4个相邻

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

使用功能光栅::焦点

联络窗口为成对比较a找到一个<<-分配:

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.

相关问题