在创建 SpatialPointsDataFrame 时忽略行,其中栅格堆栈的任何栅格图层的单个像素值为 NA

Ignore rows while creating SpatialPointDataFrame where a single pixel value of any raster layer of rasterstack is 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

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

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

您可以对 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