如何在R中按单元格编号对栅格进行子集化?

4

我正在尝试根据单元格编号对光栅进行子集处理。我想提供一个单元格编号的向量,并返回具有该向量中引用的单元格的原始单元格值的光栅。我尝试了rasterFromCells()函数,但这似乎在单元格编号之间进行插值,不返回值,而是返回单元格编号。我已经尝试过:

#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)

我应该如何返回一个栅格图层,使得单元格编号为2、20和200的值为foo,而所有其他单元格的值为NA

你想让这些值放在哪些单元格里?你的问题是关于将所有不在my.pts上的单元格设置为NA吗? - aichao
谢谢提问。是的,将所有非 my.pts 单元格设置为 NA 将起作用。 - alaybourn
2个回答

3
如果您想创建一个新的栅格,在其中仅将my.pts中的单元格位置上的值替换为foo中这些单元格位置上的值,并将所有其他单元格值设置为NA,您只需要:
  1. 创建一个与foo大小相同的栅格(即bar)。
  2. NA填充它。
  3. 使用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中的所有单元格位置设置为NA

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

2
rasterFromCells的优点在于它返回一个更小的栅格,因为它仅包含您想要的裁剪版本。
因此,您需要将初始栅格(r)的值再次输入到新栅格(r2)中,这得益于新栅格(r2)返回原始单元格编号。
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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接