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

时间:2016-09-07 17:02:16

标签: r r-raster

我正在尝试根据单元格编号对栅格进行子集化。我想提供一个单元格数字的向量,并返回一个栅格,其中包含单元格数向量中引用的那些单元格的原始单元格值。我尝试了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值?

2 个答案:

答案 0 :(得分:2)

如果要创建新的栅格,my.pts中的单元格位置的值仅替换为foo中这些单元格位置的值,而所有其他单元格值都设置为NA你必须:

  1. 创建与bar大小相同的栅格(即foo)。
  2. NA s
  3. 填写
  4. 使用bar[my.pts] <- foo[my.pts]
  5. 例如:

    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.ptsNA

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

答案 1 :(得分:2)

rasterFromCells的优点是它返回一个较小的栅格,因为它只包含你想要的裁剪版本。

所以你需要做的是再次输入新的光栅( r )的值( r ),这是由事实所缓解的新的( 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