Ho un valore raster:
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)
Da questo raster, come posso assegnare valori (o modificare valori) alle 8 celle adiacenti della cella corrente secondo questa illustrazione? Ho inserito un punto rosso all'interno della cella corrente da questa riga di codice:
points(xFromCol(r, col=5), yFromRow(r, row=5),col="red",pch=16)
Qui, il risultato atteso sarà:
dove il valore della cella corrente (ovvero 5 nel valore raster) viene sostituito con 0.
Complessivamente, i nuovi valori per le 8 celle adiacenti devono essere calcolati come segue:
Nuovo valore = media dei valori di cella contenuti nel rettangolo rosso * distanza tra la cella corrente (punto rosso) e la cella adiacente (ovvero sqrt (2) per celle adiacenti in diagonale o 1 altrimenti)
Aggiornare
Quando i limiti per le celle adiacenti sono fuori dai limiti del raster, devo calcolare nuovi valori per le celle adiacenti che rispettano le condizioni. Le celle adiacenti che non rispettano le condizioni saranno uguali a "NA".
Ad esempio, se la posizione di riferimento è c (1,1) anziché c (5,5) utilizzando la notazione [riga, colonna], è possibile calcolare solo il nuovo valore nell'angolo in basso a destra. Pertanto, il risultato atteso sarà:
[,1] [,2] [,3]
[1,] NA NA NA
[2,] NA 0 NA
[3,] NA NA New_value
Ad esempio, se la posizione di riferimento è c (3,1), è possibile calcolare solo i nuovi valori negli angoli in alto a destra, a destra e in basso a destra. Pertanto, il risultato atteso sarà:
[,1] [,2] [,3]
[1,] NA NA New_value
[2,] NA 0 New_value
[3,] NA NA New_value
Ecco il mio primo tentativo in questo senso utilizzando la funzione focal
ma ho qualche difficoltà a creare un codice automatico.
Seleziona celle adiacenti
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)
se la cella adiacente si trova nell'angolo in alto a sinistra della cella corrente
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))
se la cella adiacente si trova nell'angolo medio-alto della cella corrente
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))
se la cella adiacente si trova nell'angolo in alto a sinistra della cella corrente
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))
se la cella adiacente si trova nell'angolo sinistro della cella corrente
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))
se la cella adiacente si trova nell'angolo destro della cella corrente
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))
se la cella adiacente si trova nell'angolo in basso a sinistra della cella corrente
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))
se la cella adiacente si trova nell'angolo in basso al centro della cella corrente
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))
se la cella adiacente si trova nell'angolo in basso a destra della cella corrente
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))
. Come posso ottenere il risultato solo per le 8 celle adiacenti della cella corrente e non per tutto il raster? Qui, il risultato dovrebbe essere: res <- matrix(c(7.42,0,0,0,0,0,0,0,0), nrow=3, ncol=3, byrow = T)
. Molte grazie !
raster
pacchetto di R e allafocal()
funzione (p. 90 documentazione): cran.r-project.org/web/packages/raster/raster.pdf