Search code examples
rdplyrgeospatialrasterspatial

How to extract values of a raster stack into separate columns?


I have rasters of different vegetation measurements (i.e., canopy height, veg density). I want to stack the layers and use dplyr to extract values and assign to different columns. How can I do this? Sample code below. Sorry for not having a reproducible example.

Instead of this:

RSF_df.sf <- RSF_df.sf %>%
  mutate(can_cover5m = raster::extract(can_cover5m, RSF_df.sf),
         veg_density1mheight_5m = raster::extract(veg_density1mheight_5m, RSF_df.sf),
         veg_density2mheight_5m = raster::extract(veg_density2mheight_5m, RSF_df.sf),
         veg_density3mheight_5m = raster::extract(veg_density3mheight_5m, RSF_df.sf),
         veg_density4mheight_5m = raster::extract(veg_density4mheight_5m, RSF_df.sf),
         veg_density5mheight_5m = raster::extract(veg_density5mheight_5m, RSF_df.sf),
         veg_density_over5mheight_5m = raster::extract(veg_density_over5mheight_5m, RSF_df.sf))
summary(RSF_df.sf)

I want this, but with each veg. measurement in a separate column:

all_land_data<-addLayer(can_cover5m,veg_density1mheight_5m,veg_density2mheight_5m,veg_density3mheight_5m,
                        veg_density4mheight_5m,veg_density5mheight_5m,veg_density_over5mheight_5m)

del <- RSF_df.sf %>%
  mutate(all_land_data = raster::extract(raster stack, RSF_df.sf)) #I need values for each veg. measurment in seperate columns
summary(del)

Solution

  • Unless I misunderstood, I think you are making this more complicated than necessary. If you use the terra package, and read all rasters in together, a SpatRaster stack is created. Then, using terra::extract to extract values for each feature in a terra::vect object will produce a data.frame with columns for each raster layer in the stack.

    i.e.

    library(terra)
    veg_stk <- c(rast(veg_density1mheight_5m), rast(veg_density2mheight_5m), rast(veg_density3mheight_5m), rast(can_cover5m)
    RSF_vect <- vect(RSF_df.sf)
    
    del <- terra::extract(veg_stk, RSF_vect, fun = mean)  # returns a DF