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))
raster
paquete de R y lafocal()
función (p. 90 documentación): cran.r-project.org/web/packages/raster/raster.pdfmat <- 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 !Respuestas:
La
AssignValuesToAdjacentRasterCells
siguiente función devuelve un nuevo objeto RasterLayer con los valores deseados asignados desde la entrada ráster original . La función verifica si las celdas adyacentes desde la posición de referencia están dentro de los límites ráster. También muestra mensajes si hay algún límite. Si necesita mover la posición de referencia, simplemente puede escribir una iteración cambiando la posición de entrada a c ( i , j ).Entrada de datos
Función
Ejecutar ejemplos
Trazar ejemplos
Ejemplo de la figura
Nota: los
NA
valores medios de los glóbulos blancosfuente
Para un operador de matriz en una matriz pequeña, esto tiene sentido y es manejable. Sin embargo, es posible que desee repensar realmente su lógica al aplicar una función como esta a un gran ráster. Conceptualmente, esto no sigue realmente en la aplicación general. Estás hablando de lo que tradicionalmente se ha denominado estadística de bloque. Sin embargo, una estadística de bloque es, por naturaleza, comenzando en una esquina del ráster y reemplazando bloques de valores, dentro de un tamaño de ventana especificado, con un operador. Normalmente este tipo de operador es para agregar datos. Sería considerablemente más manejable si pensara en términos de uso de condiciones para calcular el valor central de una matriz. De esta manera, podría usar fácilmente una función focal.
Solo tenga en cuenta que la función focal de la trama está leyendo en bloques de datos que representan los valores focales en el vecindario definido en función de la matriz pasada al argumento w. El resultado es un vector para cada vecindario y el resultado del operador focal se asigna solo a la celda focal y no a todo el vecindario. Piense en ello como agarrar una matriz que rodea el valor de una celda, operar sobre ella, asignar un nuevo valor a la celda y luego pasar a la siguiente celda.
Si se asegura de que na.rm = FALSE, entonces el vector siempre representará la vecindad exacta (es decir, el mismo vector de longitud) y se convertirá en un objeto de matriz que se puede operar dentro de una función. Debido a esto, simplemente puede escribir una función que tome el vector esperado, coaccione en una matriz, aplique su lógica de notación de vecindad y luego asigne un único valor como resultado. Esta función se puede pasar a la función ráster :: focal.
Esto es lo que sucedería en cada celda con base en una simple coerción y evaluación de la ventana focal. El objeto "w" sería esencialmente la misma definición de matriz que uno pasaría el argumento w en foco. Esto es lo que define el tamaño del vector de subconjunto en cada evaluación focal.
Ahora cree una función que se pueda aplicar a focal aplica la lógica anterior. En este caso, puede asignar el objeto se como valor o usarlo como condición en algo como "ifelse" para asignar un valor basado en una evaluación. Estoy agregando la declaración ifelse para ilustrar cómo uno evaluaría múltiples condiciones del vecindario y aplicaría una condición de posición de matriz (notación de vecindario). En esta función ficticia, la coerción de x a una matriz es completamente innecesaria y solo existe para ilustrar cómo se haría. Se pueden aplicar condiciones de notación de vecindad directamente al vector, sin coerción matricial, porque la posición en el vector se aplicaría a su ubicación en la ventana focal y permanecería fija.
Y aplicarlo a una trama
fuente
Puede actualizar fácilmente los valores de ráster al subdividir el ráster utilizando la notación [row, col]. Solo tenga en cuenta que la fila y la columna comienzan desde la esquina superior izquierda del ráster; r [1,1] es el índice de píxeles superior izquierdo y r [2,1] es el que está debajo de r [1,1].
fuente