【问题标题】:How do I compare cell values of a raster with previous cells of this raster? binary r如何将栅格的像元值与该栅格的先前像元进行比较?二进制 r
【发布时间】:2016-12-07 12:38:01
【问题描述】:

我是新手,也是使用 R 的初学者。 那是我的问题:

我有一个包含很多单元格的大型栅格。这是一个二进制栅格,所以只有 0 和 1。我必须遍历整个光栅并找到 0。如果单元格 [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)

成功了。但问题是缺少一些。

那我该怎么办? 顺便说一句,我希望有另一种可能性来解决这个任务。也许我不需要循环?我可以想象这对于一个非常大的栅格来说不是一个很好的解决方案。 有人有想法吗?

【问题讨论】:

  • 你应该澄清你的意思是“需要成对地看它的 4 个邻居”.. 你在看他们什么?你期望什么输出?最好用文字说明这一点,而不是让我们从您的代码中找出您的意图。

标签: r loops matrix binary raster


【解决方案1】:

利用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)

使用函数 raster::focal

对于成对比较和&lt;&lt;- 赋值:

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

注意: 您必须在此处使用&lt;&lt;- 赋值才能修改函数环境之外的变量。引用Hadley:

常规赋值箭头&lt;- 总是在 当前环境。深度赋值箭头 &lt;&lt;- 永远不会创建 当前环境中的变量,而是修改现有的 通过遍历父环境找到的变量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-22
    • 2016-03-05
    • 1970-01-01
    • 1970-01-01
    • 2018-07-08
    • 1970-01-01
    • 2015-10-23
    相关资源
    最近更新 更多