Tengo un ráster de valor:
m <- matrix(c(2,4,5,5,2,8,7,3,1,6,
5,7,5,7,1,6,7,2,6,3,
4,7,3,4,5,3,7,9,3,8,
9,3,6,8,3,4,7,3,7,8,
3,3,7,7,5,3,2,8,9,8,
7,6,2,6,5,2,2,7,7,7,
4,7,2,5,7,7,7,3,3,5,
7,6,7,5,9,6,5,2,3,2,
4,9,2,5,5,8,3,3,1,2,
5,2,6,5,1,5,3,7,7,2),nrow=10, ncol=10, byrow = T)
r <- raster(m)
extent(r) <- matrix(c(0, 0, 10, 10), nrow=2)
plot(r)
text(r)
Desde este ráster, ¿cómo puedo asignar valores (o cambiar valores) a las 8 celdas adyacentes de la celda actual de acuerdo con esta ilustración? Coloqué un punto rojo dentro de la celda actual de esta línea de código:
points(xFromCol(r, col=5), yFromRow(r, row=5),col="red",pch=16)
Aquí, el resultado esperado será:
donde el valor de la celda actual (es decir, 5 en el ráster de valor) se reemplaza por 0.
En general, los nuevos valores para las 8 celdas adyacentes deben calcularse de la siguiente manera:
Nuevo valor = promedio de los valores de celda contenidos en el rectángulo rojo * distancia entre la celda actual (punto rojo) y la celda adyacente (es decir, sqrt (2) para celdas diagonalmente adyacentes o 1 de lo contrario)
Actualizar
Cuando los límites para las celdas adyacentes están fuera de los límites de la trama, necesito calcular nuevos valores para las celdas adyacentes que respetan las condiciones. Las celdas adyacentes que no respetan las condiciones serán iguales a "NA".
Por ejemplo, si la posición de referencia es c (1,1) en lugar de c (5,5) utilizando la notación [fila, col], solo se puede calcular el nuevo valor en la esquina inferior derecha. Por lo tanto, el resultado esperado será:
[,1] [,2] [,3]
[1,] NA NA NA
[2,] NA 0 NA
[3,] NA NA New_value
Por ejemplo, si la posición de referencia es c (3,1), solo se pueden calcular los nuevos valores en las esquinas superior derecha, derecha e inferior derecha. Por lo tanto, el resultado esperado será:
[,1] [,2] [,3]
[1,] NA NA New_value
[2,] NA 0 New_value
[3,] NA NA New_value
Aquí está mi primer intento de usar la función, focal
pero tengo algunas dificultades para hacer un código automático.
Seleccionar celdas adyacentes
mat_perc <- matrix(c(1,1,1,1,1,
1,1,1,1,1,
1,1,0,1,1,
1,1,1,1,1,
1,1,1,1,1), nrow=5, ncol=5, byrow = T)
cell_perc <- adjacent(r, cellFromRowCol(r, 5, 5), directions=mat_perc, pairs=FALSE, sorted=TRUE, include=TRUE)
r_perc <- rasterFromCells(r, cell_perc)
r_perc <- setValues(r_perc,extract(r, cell_perc))
plot(r_perc)
text(r_perc)
si la celda adyacente se encuentra en la esquina superior izquierda de la celda actual
focal_m <- matrix(c(1,1,NA,1,1,NA,NA,NA,NA), nrow=3, ncol=3, byrow = T)
focal_function <- function(x) mean(x,na.rm=T)*sqrt(2)
test <- as.matrix(focal(r_perc, focal_m, focal_function))
si la celda adyacente se encuentra en la esquina superior media de la celda actual
focal_m <- matrix(c(1,1,1,1,1,1,NA,NA,NA), nrow=3, ncol=3, byrow = T)
focal_function <- function(x) mean(x,na.rm=T)
test <- as.matrix(focal(r_perc, focal_m, focal_function))
si la celda adyacente se encuentra en la esquina superior izquierda de la celda actual
focal_m <- matrix(c(NA,1,1,NA,1,1,NA,NA,NA), nrow=3, ncol=3, byrow = T)
focal_function <- function(x) mean(x,na.rm=T)*sqrt(2)
test <- as.matrix(focal(r_perc, focal_m, focal_function))
si la celda adyacente se encuentra en la esquina izquierda de la celda actual
focal_m <- matrix(c(1,1,NA,1,1,NA,1,1,NA), nrow=3, ncol=3, byrow = T)
focal_function <- function(x) mean(x,na.rm=T)
test <- as.matrix(focal(r_perc, focal_m, focal_function))
si la celda adyacente se encuentra en la esquina derecha de la celda actual
focal_m <- matrix(c(NA,1,1,NA,1,1,NA,1,1), nrow=3, ncol=3, byrow = T)
focal_function <- function(x) mean(x,na.rm=T)
test <- as.matrix(focal(r_perc, focal_m, focal_function))
si la celda adyacente se encuentra en la esquina inferior izquierda de la celda actual
focal_m <- matrix(c(NA,NA,NA,1,1,NA,1,1,NA), nrow=3, ncol=3, byrow = T)
focal_function <- function(x) mean(x,na.rm=T)*sqrt(2)
test <- as.matrix(focal(r_perc, focal_m, focal_function))
si la celda adyacente se encuentra en la esquina inferior central de la celda actual
focal_m <- matrix(c(NA,NA,NA,1,1,1,1,1,1), nrow=3, ncol=3, byrow = T)
focal_function <- function(x) mean(x,na.rm=T)
test <- as.matrix(focal(r_perc, focal_m, focal_function))
si la celda adyacente se encuentra en la esquina inferior derecha de la celda actual
focal_m <- matrix(c(NA,NA,NA,NA,1,1,NA,1,1), nrow=3, ncol=3, byrow = T)
focal_function <- function(x) mean(x,na.rm=T)*sqrt(2)
test <- as.matrix(focal(r_perc, focal_m, focal_function))
mat <- matrix(c(1,1,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0), nrow=5, ncol=5, byrow = T)
f.rast <- function(x) mean(x)*sqrt(2)
aggr <- as.matrix(focal(r, mat, f.rast))
. ¿Cómo puedo obtener el resultado solo para las 8 celdas adyacentes de la celda actual y no para todo el ráster? En este caso, el resultado debería ser: res <- matrix(c(7.42,0,0,0,0,0,0,0,0), nrow=3, ncol=3, byrow = T)
. Muchas gracias !
raster
paquete de R y lafocal()
función (p. 90 documentación): cran.r-project.org/web/packages/raster/raster.pdf