1 votos

Subconjunto por año en una pila de rásters, guardar pilas de rásters individuales, y luego hacer un bucle en la función biovars en R

Tengo ladrillos rasterizados de la temperatura máxima mensual, la temperatura mínima y la precipitación para varios períodos de tiempo (por ejemplo, de 2090 a 2100, en este ejemplo).

> tmax
class      : RasterBrick 
dimensions : 3875, 8017, 31065875, 132  (nrow, ncol, ncell, nlayers)
resolution : 0.04490319, 0.04490319  (x, y)
extent     : -180.0393, 179.9495, -90.04088, 83.95898  (xmin, xmax, ymin, ymax)
crs        : +proj=longlat +datum=WGS84 
source     : Z:/CHELSAcmip5ts_tasmax_ACCESS1-3_rcp85_2090-2100.nc 
names      : X2090.01.15, X2090.02.15, X2090.03.15, X2090.04.15, X2090.05.15, X2090.06.15, X2090.07.15, X2090.08.15, X2090.09.15, X2090.10.15, X2090.11.15, X2090.12.15, X2091.01.15, X2091.02.15, X2091.03.15, ... 
Date       : 2090-01-15, 2100-12-15 (min, max)
varname    : air_temperature 

Necesito (a) crear pilas individuales de rasterización que consistan en 12 capas para cada año del período. Sé que puedo hacer lo siguiente para subconjuntar y guardar los raster individuales:

sub_ras <- subset(tmax,  grep("X2090", names(tmax)))  
writeRaster(sub_ras, file="tmax2090", format="GTiff")

Pero no estoy seguro de cómo hacer un bucle de esto? Eventualmente necesitaré hacer esto para un ladrillo raster de datos mensuales de 1970 a 2100.

Una vez que tenga mis pilas de rasterización individuales para cada año, tendré que leerlas individualmente en la función biovars para crear variables bioclimáticas para cada año. Para ello, utilizaré mapply de la siguiente manera:

pre = c("/path/pre2090.tif", "/path/pre2091.tif", ..., "/path/prec2100.tif")
tmax = c("/path/tmax2090.tif", "/path/tmax2091.tif", ..., "/path/tmax2100.tif")
tmin = c("/path/tmin2090.tif", "/path/tmin2091.tif", ..., "/path/tmin2100.tif")

output <- mapply(FUN = biovars, pre, tmin, tmax)

¿Me dará esto una trama de biovares para cada año?

¿O alguien tiene una sugerencia más elegante para este proceso?

1 votos

Por favor, utilice un texto con formato de código en lugar de una captura de pantalla.

2voto

Elio Diaz Puntos 11

En cuanto a la parte del bucle, el siguiente código itera entre 90 y 100 escribiendo una capa para cada año; las capas tendrán bandas para cada mes:

library(raster)
library(dismo)

for(i in 90:100){ 
sub_ras <- subset(tmax,  grep(sprintf("X2%03d", i), names(tmax)))  
writeRaster(sub_ras, file=sprintf("tmax2%03d.tif", i))
}

Para obtener las 12 capas de cada año que hemos escrito para archivar puede utilizar stack("tmax2090.tif") . Y en lugar de escribir el nombre de cada archivo puede utilizar

tmax_names = list.files("path", "tmax", full.names = T)

Entonces puede utilizar el mapply funcionan como se pretende.

El mismo objetivo puede alcanzarse si se calcula directamente el biovars en el bucle for, de esta manera puede evitar duplicar los archivos, por ejemplo:

for(i in 90:100){ 
sub_tmax <- subset(tmax,  grep(sprintf("X2%03d", i), names(tmax)))  
sub_tmin <- subset(tmin,  grep(sprintf("X2%03d", i), names(tmin)))
sub_prec <- subset(prec,  grep(sprintf("X2%03d", i), names(prec)))
bv_temp = biovars(sub_prec, sub_tmin, sub_tmax)  
writeRaster(bv_temp, file=sprintf("biovars2%03d.tif", i))
}

Además, si quieres apilarlos (todos los 12*20):

bv = stack()
for(i in 90:100){ 
sub_tmax <- subset(tmax,  grep(sprintf("X2%03d", i), names(tmax)))  
sub_tmin <- subset(tmin,  grep(sprintf("X2%03d", i), names(tmin)))
sub_prec <- subset(prec,  grep(sprintf("X2%03d", i), names(prec)))
bv_temp = biovars(sub_prec, sub_tmin, sub_tmax)  
colnames(bv_temp) = paste0(sprintf("X2%03d_", i), colnames(bv_temp))
bv = stack(bv, bv_temp)
}

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