如何通过 R 中的单元格编号对栅格进行子集化?

How to subset a raster by cell number in R?

我正在尝试根据像元数对栅格进行子集化。我想提供一个单元格编号向量和 return 一个栅格,其中包含单元格编号向量中引用的那些单元格的原始单元格值。我尝试了 rasterFromCells() 函数,但这似乎是在单元格编号之间进行插值,而不是 return 值,而是单元格编号。我试过:

#original raster loaded with 400 sample values ranging from 1:24
foo <- raster(ncol=20, nrow=20)
foo[] <- sample(seq(1,24),400,replace = TRUE)
#vector of desired cell numbers
my.pts <- c(2,20,200)
#rasterFromCells attempt
bar<-rasterFromCells(foo, my.pts, values=TRUE)

如何 return 栅格图层 foo 的单元格编号 2、20 和 200 以及所有其他单元格的值 NA

如果您想要创建一个新栅格,仅将 my.pts 中像元位置的值替换为 foo 中那些像元位置的值,并将所有其他像元值设置为 NA,你只需要:

  1. 创建与 foo.
  2. 大小相同的栅格(即 bar
  3. 填入NAs
  4. 使用bar[my.pts] <- foo[my.pts]

例如:

library(raster)
set.seed(123) ## for reproducible results
foo <- raster(ncols=20, nrows=20)
foo[] <- sample(seq(1,24),400,replace = TRUE)
#vector of desired cell numbers
my.pts <- c(2,20,200)

## create raster the same size as foo filled with NAs
bar <- raster(ncols=ncol(foo), nrows=nrow(foo))
bar[] <- NA
## replace the values with those in foo
bar[my.pts] <- foo[my.pts]

foo[my.pts]
##[1] 19 23 14

bar[]
##  [1] NA 19 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA 23 NA NA NA NA NA NA NA NA NA NA NA
## [32] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
## [63] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
## [94] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
##[125] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
##[156] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
##[187] NA NA NA NA NA NA NA NA NA NA NA NA NA 14 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
##[218] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
##[249] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
##[280] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
##[311] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
##[342] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
##[373] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA

实现相同结果的另一种方法是将 foo 复制到 bar,然后将不在 my.pts 中的所有单元格位置设置为 NAs:

bar <- foo
bar[setdiff(1:ncell(foo),my.pts)] <- NA

rasterFromCells 的优点是它 returns 更小的光栅,因为它只包含您想要的裁剪版本。

所以您需要做的是再次将初始栅格 (r) 的值输入到新栅格 (r2 ), 新的 (r2) returns 原始细胞数:

r <- raster(ncols=100, nrows=100)
r[] <- rnorm(ncell(r))

cells <- c(3:5, 210)

r2 <- rasterFromCells(r, cells, values=TRUE)
ini_cells <- getValues(r2)

只需根据索引输入值:

r2[] <- r[ini_cells]

这会产生 24 个像元而不是 10'000 个像元的栅格!

c(ncell(r), ncell(r2))

让我们比较一下结果:

data.frame(Orig=getValues(r)[cells], New=getValues(r2)[ini_cells %in% cells])
           [,1]       [,2]
[1,] -0.5081512 -0.5081512
[2,] -0.8799739 -0.8799739
[3,]  0.3722788  0.3722788
[4,] -0.7661364 -0.7661364

注意:您想将所有其他设置为 NA。你会这样做:

r2[!ini_cells %in% cells] <- NA
head(getValues(r2))
-0.5081512 -0.8799739  0.3722788         NA         NA         NA