首页 > 解决方案 > 在创建 SpatialPointDataFrame 时忽略行,其中 rasterstack 的任何栅格层的单个像素值为 NA

问题描述

我有三个栅格,例如 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

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

    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

标签: rspatialrastersp

解决方案


我们可以使用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

推荐阅读