【问题标题】:Extracting individual layers from raster stack in loop从循环中的栅格堆栈中提取单个图层
【发布时间】:2016-02-17 13:11:35
【问题描述】:

我有一个 18 层的 RasterStack。我需要将所有图层提取为单独的图层。但我不想将这些文件写入磁盘(所以不使用writeRaster 函数)。我只想将它们提取到工作空间。 当我使用for 循环时,我得到一个层(最后一层),并且没有其他层被保存到工作区。

for(i in 1:nlayers(r)) {
  X <- r[[i]]
}

我在这个循环中缺少什么?

【问题讨论】:

  • 那是因为你不断用下一层覆盖X,所以.. X 将是最后一层,因为那一层不会被覆盖。将它们保留在r 有什么问题?还是您特别需要 18 个不同的变量?
  • 所有层都代表不同的变量,所以我想分别提取它们。但现在我使用r[[i]] 来访问不同的层。
  • 好吧,您可以使用vars &lt;- paste0("X",1:18); for (i in 1:18) assign(vars[i],r[[i]]) 创建单个变量。这将创建 18 个变量(X1X18)。但是,请记住,从那时起,您将拥有 18 个独立的对象,这使得自动化变得比使用 r[[i]] 困难得多。另请阅读:stackoverflow.com/a/17559641/5805670

标签: r for-loop stack raster


【解决方案1】:

您可以为此使用unstacklist2env

library(raster)
s <- stack(replicate(5, raster(matrix(runif(100), 10))))

s
## class       : RasterStack 
## dimensions  : 10, 10, 100, 5  (nrow, ncol, ncell, nlayers)
## resolution  : 0.1, 0.1  (x, y)
## extent      : 0, 1, 0, 1  (xmin, xmax, ymin, ymax)
## coord. ref. : NA 
## names       :     layer.1,     layer.2,     layer.3,     layer.4,     layer.5 
## min values  : 0.011998514, 0.003202582, 0.020602761, 0.023202067, 0.000311564 
## max values  :   0.9814509,   0.9963595,   0.9931403,   0.9766521,   0.9977042

ls()
## [1] "s"

list2env(setNames(unstack(s), names(s)), .GlobalEnv)
ls()
## [1] "layer.1" "layer.2" "layer.3" "layer.4" "layer.5" "s"   

我们将unstackRasterStack 分配给单个栅格图层列表,将图层名称分配为列表元素名称,然后将每个元素分配给具有相应名称的对象,在指定的环境(全局环境, 上)。

请注意,如果环境中的对象名称与列表元素的名称冲突,它们将被覆盖。

更多详情请参阅?list2env

【讨论】:

    猜你喜欢
    • 2014-11-01
    • 2016-04-09
    • 2016-04-19
    • 1970-01-01
    • 2013-01-18
    • 1970-01-01
    • 1970-01-01
    • 2016-11-17
    • 2021-12-11
    相关资源
    最近更新 更多