在创建 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
中的任何缺失值,然后从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
您可以对 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
我有三个栅格,例如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
中的任何缺失值,然后从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
您可以对 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