0

Let's say I have a SpatRaster data containing 2 variables. One of them is called "elev", and the other is called "relative_elev":

library(terra)
f = system.file("ex/elev.tif", package="terra")
r1 = rast(f)
r2 = rast(f)
varnames(r2) = "relative_elev"
r_combined = c(r1, r2)

Checking the variable names:

varnames(r_combined)
#[1] "elev"          "relative_elev"

I want to subset data based on their names. When I do r_combined["elev"] I expect to get only the elev data, but I get both "elev" and "relative_elev":

r_combined["elev"]
#class       : SpatRaster 
#dimensions  : 90, 95, 2  (nrow, ncol, nlyr)
#resolution  : 0.008333333, 0.008333333  (x, y)
#extent      : 5.741667, 6.533333, 49.44167, 50.19167  (xmin, xmax, ymin, ymax)
#coord. ref. : lon/lat WGS 84 (EPSG:4326) 
#sources     : elev.tif  
#              elev.tif  
#varnames    : elev 
#              relative_elev 
#names       : elevation, elevation 
#min values  :       141,       141 
#max values  :       547,       547 

When I do r_combined["relative_elev"] I get an error:

r_combined["relative_elev"]
#Error: [subset] no (valid) layer selected

Both behaviours are very unexpected and confusing to me.

2 Answers 2

1

names refers to layers, varnames to variables or sub-datasets. varnames can be used to extract a sub-dataset (variable) from a SpatRasterDataset.

s <- sds(r1, r2)
s
#class       : SpatRasterDataset 
#subdatasets : 2 
#dimensions  : 90, 95 (nrow, ncol)
#nlyr        : 1, 1 
#resolution  : 0.008333333, 0.008333333  (x, y)
#extent      : 5.741667, 6.533333, 49.44167, 50.19167  (xmin, xmax, ymin, ymax)
#coord. ref. : lon/lat WGS 84 (EPSG:4326) 
#source(s)   : elev.tif 
#names       : elev, relative_elev 


s["relative_elev"]
#class       : SpatRaster 
#dimensions  : 90, 95, 1  (nrow, ncol, nlyr)
#resolution  : 0.008333333, 0.008333333  (x, y)
#extent      : 5.741667, 6.533333, 49.44167, 50.19167  (xmin, xmax, ymin, ymax)
#coord. ref. : lon/lat WGS 84 (EPSG:4326) 
#source      : elev.tif 
#varname     : relative_elev 
#name        : elevation 
#min value   :       141 
#max value   :       547 

To be able to subset like this, perhaps you should read your file with sds(filename) instead of rast(filename).

Sign up to request clarification or add additional context in comments.

Comments

1

Using names in place of varnames like following worked for me

library(terra)

f = system.file("ex/elev.tif", package="terra")

r1 = rast(f)

r2 = rast(f)

names(r2) = "relative_elev"

r_combined = c(r1, r2)

r_combined["elevation"]
r_combined["relative_elev"]

1 Comment

My original data has different varnames and I need to use varnames instead of names

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.