I'm having issues fully understanding terra:extract. I wish to extract average raster values for administrative GADM polygons. My raster has one single value per country. I would expect that each administrative polygon within a particular country has the same value, and some polygons that include some country border be allocated area weighted averages. Unfortunately, this is not the case with my current script. raster::extract seems to be giving sensible results but not terra:extract (see my sample code below - providing outputs with different values). Could someone kindly explain me why, in light of my code below? Thank you very much.
## libraries
library(terra)
library(raster)
#===============================================
## sample example - provides results as expected (1.333, that is (2*0.5+1*1)/1.5)
# sample raster and SpatialPolygons
r <- raster(ncol=2, nrow=3, xmn= 0, ymn= 0, xmx = 30,ymx = 30)
r[] <- c(2, 2, 2, 1, NA, NA)
cds <- rbind(c(7.5,0), c(7.5,20), c(30, 20),c(30,10))
library(sp)
p = Polygon(cds)
ps = Polygons(list(p),1)
sps = SpatialPolygons(list(ps))
plot(r)
plot(sps, add=T)
# test raster package
test1 <- raster::extract(r , sps, fun=mean, na.rm=T, weights=TRUE)
test1 # I get 1.333333 which is what I would expect
# test terra package
sps.spatv <- vect(sps)
r.spatR <- rast(r) #conversion to SpatRaster class
test2 <- terra::extract(r.spatR, sps.spatv, fun=mean, na.rm=T, weights=TRUE, exact=TRUE, touches=TRUE)
test2 # I get 1.333333 which is what I would expect
#===============================================
## sample code that leads to different results between raster and terra packages - I wish to understand why such difference.
# sample SpatialPolygonsDataFrame
ETH <- getData("GADM", country = 'ETH', level = 2)
SOM <- getData("GADM", country = 'SOM', level = 2)
sps <- bind(ETH, SOM)
# sample raster stack
ra <- raster(ncol=31, nrow=24, xmn= 33.3, ymn= 3.67, xmx = 47.5, ymx = 14.65, crs=crs(sps) )
ra[] <- rep(10, 24*31)
ra2 <- raster(ncol=31, nrow=24, xmn= 33.3, ymn= -7.31 , xmx = 47.5, ymx = 3.67, crs=crs(sps) )
ra2[] <- rep(20, 24*31)
ra3 <- merge(ra, ra2)
rb <- raster(ncol=31, nrow=24, xmn= 33.3, ymn= 3.67, xmx = 47.5, ymx = 14.65, crs=crs(sps) )
rb[] <- rep(35, 24*31)
rb2 <- raster(ncol=31, nrow=24, xmn= 33.3, ymn= -7.31 , xmx = 47.5, ymx = 3.67, crs=crs(sps) )
rb2[] <- rep(45, 24*31)
rb3 <- merge(rb, rb2)
stack.r <- stack(ra3, rb3)
names(stack.r) <- c("ra3", "rb3")
plot(stack.r[[1]])
plot(sps, add=T)
# raster::extract
rastR <- raster::extract(stack.r, sps, fun=mean, na.rm=T, weights=TRUE)
# > head(rastR)
# [,1] [,2]
# [1,] 10 35
# [2,] 10 35
# [3,] 10 35
# [4,] 10 35
# [5,] 10 35
# [6,] 10 35
rastR2 <- rastR %>%
cbind(sps@data["GID_2"]) # add ID
# terra::extract
sps.spatv <- vect(sps)
stack.r.spatR <- rast(stack.r)
rastT <- terra::extract(stack.r.spatR, sps.spatv, fun=mean, na.rm=T, exact=TRUE)
# > head(rastT)
# ID ra3 rb3
# [1,] 1 10 10
# [2,] 2 10 10
# [3,] 3 10 10
# [4,] 4 10 10
# [5,] 5 10 10
# [6,] 6 10 10
rastT2 <- rastT %>%
cbind(sps@data["GID_2"]) # add ID