TransWikia.com

Naming raster layers in a rasterstack with the same name

Geographic Information Systems Asked by Joanne Bentley on February 10, 2021

I have a for loop where I loop layers from a rasterstack into a predict function, which requires the output of a model and two raster files, including one layer for the present ("rastFile") and one stack or brick for the future ("stackedRast"), as follows:

  for (i in 1:94){
  
  timePred <- predict(G15.gdm.1, rastFile, time=TRUE, predRasts=stackedRast[[i]])
  
  stack(timePred,stackedRast[[i]])
  
  writeRaster(timePred, "xxxxx.tif")
  
  rm(timePred)
  
}

First of all, for the predict function to work, I need all the layers in the rasterstack to have the same name, for instance "bio1"

for (i in 1:nlayers(stacked)) {names(stacked[[i]]) <- "bio1"}

However, R adds a number to the end of the layer names, like this:

> stackedRast
class      : RasterStack 
dimensions : 1200, 2760, 3312000, 4  (nrow, ncol, ncell, nlayers)
resolution : 0.04166667, 0.04166667  (x, y)
extent     : -180, -65, 35, 85  (xmin, xmax, ymin, ymax)
crs        : +proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0 
names      :    bio1.1,    bio1.2,    bio1.3,    bio1.4 
min values : -24.70417, -22.44583, -19.79583, -16.23750 
max values :  25.96667,  27.47917,  28.76250,  30.28750 

Is there a way to get around this? (P.S. I’ve just included a smaller rasterstack of 4 layers for the example, but my final rasterstack will have 94 layers).

Does anyone please have a suggestion for how I can elegantly create one process (loop or otherwise) for changing the layer names so that they all match?

One Answer

The raster package is very strict about names, it seems, and really doesn't want you to have two layers in a stack with the same names. Weirdly you can make a plain R list with two elements with the same name:

> L = list(a=1, a=2)
> L$a
[1] 1
> names(L)
[1] "a" "a"

but the only way to get the second one is with L[[2]].

But the raster package goes through a lot of effort to stopping you from doing this.

I think you'll have to pull each layer out and name it individually as you go through the loop. For example:

for (i in 1:94){
  stackedRast_i = stackedRast[[i]]
  names(stackedRast_i) = "bio1"
  timePred <- predict(G15.gdm.1, rastFile, time=TRUE,
    predRasts=stackedRast_i)
  ...

There's a neater way of doing this via setNames which returns a named version of its argument:

> s1 = setNames(s[[1]], "bio1")
> names(s1)
[1] "bio1"

So your loop can be:

 for (i in 1:94){
    timePred <- predict(G15.gdm.1, rastFile, time=TRUE,
      predRasts=setNames(stackedRast[[i]],"bio1"))

Note this doesn't change the names of stackedRast, it returns a raster layer with the name set on it.

Answered by Spacedman on February 10, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP