See the `cats` and `levels` methods. They are used to have rasters that behave like "factors". The issues you describe have been fixed in terra 1.1-17 (on its way to CRAN). For now, what you can do is something along these lines: library(raster) f <- "nlcd_agg.grd" r <- raster(f) library(terra) x <- rast(r) # get the attributes lev <- levels(r)[[1]] lev <- lev[, c("ID", "Land.Cover.Class")] lev[,2] <- as.character(lev[,2]) x <- rast(r) levels(x) <- lev is.factor(x) #[1] TRUE x #class : SpatRaster #dimensions : 101, 121, 1 (nrow, ncol, nlyr) #resolution : 3750, 3750 (x, y) #extent : 1394535, 1848285, 1722765, 2101515 (xmin, xmax, ymin, ymax) #coord. ref. : +proj=aea +lat_0=23 +lon_0=-96 +lat_1=29.5 +lat_2=45.5 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs #source : memory #name : nlcd_2011_landcover_2011_edition_2014_03_31 #min value : Unclassified #max value : # legend shows class names plot(x) Labels are returned as cell values x[c(7357, 5047, 7360, 9307)] # nlcd_2011_landcover_2011_edition_2014_03_31 #1 Perennial Snow/Ice #2 Open Water #3 Perennial Snow/Ice #4 Unclassified And the categories are stored if you save the raster to a GeoTIFF z <- writeRaster(x, "test.tif", overwrite=TRUE) z ch