2 votos

¿Recortar múltiples rásters utilizando map o mapply?

Tengo una carpeta de rásters con extensiones ligeramente diferentes. Me gustaría aplicar crop a toda la lista de rásters. Estoy tratando de enseñarme a mí mismo cómo utilizar el purrr map familia, pero no puedo conseguir que o mapply para aplicar una función con varios argumentos a una lista de ficheros, es decir

# reproducible example raster w/ categorical values
# from: https://stackoverflow.com/questions/9940495/plot-raster-factir-values-with-ggplot
library(raster)

f <- system.file("external/test.grd", package="raster")
r <- raster(f)
r <- reclassify(r, c(0, 500, 1,  # from, to, becomes
                     500, 2000, 2))
levels(r)
rcat <- as.factor(r)
levels(rcat)  # 2 levels
extent(rcat)
# make second raster of slightly different extent
extnew1 <- as(extent(178000, 181520, 329400, 334000), "SpatialPolygons")
rcat2 <- crop(rcat, extnew1)
extent(rcat2)

# list of rasters with different extents
mylist <- list(rcat, rcat2)
unique(map(mylist, extent))  # different extents

# crop both to smaller extent
extnew2 <- as(extent(178400, 181500, 329300, 334000), "SpatialPolygons")

# does not work
rcat_crop <- map(mylist, crop, extnew2)

unique(map(rcat_crop, extent)) # matches smallest extent of rasters, not new extent

# does not work
rcat_crop <- mapply(FUN=crop, MoreArgs=list(x=mylist, y=extnew2))

length(rcat_crop)  # =0

¿Qué estoy haciendo mal?

Pregunta relacionada sobre cómo recortar utilizando R

2voto

Jay Bazuzi Puntos 194

Esto no parece tener nada que ver con purrr::map (y por favor utilice purrr::map para evitar enfrentamientos con map en el maps paquete).

purrr::map aplica una función a lo largo de una lista. Así:

> rcat_crop <- map(mylist, crop, extnew2)

debe ser el mismo que el resultado de una lista de crop operaciones:

> rcat_crop2 = list(crop(mylist[[1]], extnew2), crop(mylist[[2]],extnew2))

¿y lo es?

> identical(rcat_crop2, rcat_crop)
[1] TRUE
> 

Sí.

No estoy seguro de por qué usted está tratando de utilizar mapply la función R para aplicar una función sobre una lista es lapply que hace prácticamente lo mismo que purrr::map sin tener que cargar un conjunto de paquetes completamente nuevo:

> rcat_crop_lapply <- lapply(mylist, crop, y=extnew2)
> rcat_crop_map <- purrr::map(mylist, crop, extnew2)
> identical(rcat_crop_map, rcat_crop_lapply)
[1] TRUE

¿Es esto realmente un malentendido en lo que crop puede hacer? crop nunca ampliará una trama que sea más pequeña que la extensión de recorte. extend para eso.

Además, un ráster recortado sólo contendrá celdas enteras, por lo que el recorte de un objeto espacial como los polígonos no producirá necesariamente un ráster con la misma extensión que los polígonos.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X