【问题标题】:Ignore rows while creating SpatialPointDataFrame where a single pixel value of any raster layer of rasterstack is NA在创建 SpatialPointDataFrame 时忽略行,其中 rasterstack 的任何栅格层的单个像素值为 NA
【发布时间】:2019-11-30 02:06:51
【问题描述】:

我有三个栅格,例如r1,r2,r3。我想使用 rasterToPoints() 从这些栅格中创建一个空间点数据框。但问题是,我想在执行 rasterToPoints() 期间忽略任何包含至少一个 NA 的行。

library(raster)
r1 = raster(matrix(c(1,NA,2,3,4,5,NA,5,6), byrow = TRUE))
r2 = raster(matrix(c(1,2,2,NA,4,5,NA,5,64), byrow = TRUE))
r3 = raster(matrix(c(1,NA,2,3,56,5,54,5,6), byrow = TRUE))
r = stack(r1,r2,r3)
r_spdf = rasterToPoints(r, spatial = TRUE)
r_spdf@data
    layer.1 layer.2 layer.3
1       1       1       1
2      NA       2      NA
3       2       2       2
4       3      NA       3
5       4       4      56
6       5       5       5
7      NA      NA      54
8       5       5       5
9       6      64       6

如果单个单元格为 NA 并且输出如下所示,我想忽略 r_spdf@data 中的整行:

    layer.1 layer.2 layer.3
1       1       1       1
2       2       2       2
3       4       4      56
4       5       5       5
5       5       5       5
6       6      64       6

随后 r_spdf@coords 将仅具有上述行的坐标,例如:

   > r_spdf@coords
         x          y
   [1,] 0.5 0.94444444
   [2,] 0.5 0.72222222
   [3,] 0.5 0.50000000
   [4,] 0.5 0.38888889
   [5,] 0.5 0.16666667
   [6,] 0.5 0.05555556

【问题讨论】:

    标签: r spatial raster sp


    【解决方案1】:

    我们可以使用complete.cases 查找data 中的任何缺失值,然后从data 和coords 中删除相应的索引。

    inds <- complete.cases(r_spdf@data)
    #Or another way to calculate inds is using rowSums
    #inds <- !rowSums(is.na(r_spdf@data)) > 0
    
    #now subset the Spatial object
    r_spdf <- r_spdf[inds, ]
    
    r_spdf@data
    #  layer.1 layer.2 layer.3
    #1       1       1       1
    #3       2       2       2
    #5       4       4      56
    #6       5       5       5
    #8       5       5       5
    #9       6      64       6
    
    r_spdf@coords
    #       x          y
    #[1,] 0.5 0.94444444
    #[2,] 0.5 0.72222222
    #[3,] 0.5 0.50000000
    #[4,] 0.5 0.38888889
    #[5,] 0.5 0.16666667
    #[6,] 0.5 0.05555556
    

    【讨论】:

      【解决方案2】:

      您可以对 SpatialPointsDataFrame 进行子集化,或更改栅格,以便如果任何单元格为 NA,则该单元格在所有图层中都变为 NA。像这样

      m <- sum(is.na(r))
      s <- mask(r, m, maskvalue=0, inverse=TRUE)
      

      现在你得到你想要的

      r_spdf <- rasterToPoints(s, spatial = TRUE)
      as.data.frame(r_spdf)
      #  layer.1 layer.2 layer.3   x          y
      #1       1       1       1 0.5 0.94444444
      #2       2       2       2 0.5 0.72222222
      #3       4       4      56 0.5 0.50000000
      #4       5       5       5 0.5 0.38888889
      #5       5       5       5 0.5 0.16666667
      #6       6      64       6 0.5 0.05555556
      
      coordinates(r_spdf)
      #       x          y
      #[1,] 0.5 0.94444444
      #[2,] 0.5 0.72222222
      #[3,] 0.5 0.50000000
      #[4,] 0.5 0.38888889
      #[5,] 0.5 0.16666667
      #[6,] 0.5 0.05555556
      

      【讨论】:

        猜你喜欢
        • 2013-04-22
        • 1970-01-01
        • 1970-01-01
        • 2014-12-24
        • 2018-06-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多