Eu tenho uma varredura 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)
A partir desta varredura, como posso atribuir valores (ou alterar valores) às 8 células adjacentes da célula atual, de acordo com esta ilustração? Coloquei um ponto vermelho dentro da célula atual a partir desta linha de código:
points(xFromCol(r, col=5), yFromRow(r, row=5),col="red",pch=16)
Aqui, o resultado esperado será:
onde o valor da célula atual (ou seja, 5 na varredura de valor) é substituído por 0.
No geral, os novos valores para as 8 células adjacentes devem ser calculados da seguinte maneira:
Novo valor = média dos valores das células contidas no retângulo vermelho * distância entre a célula atual (ponto vermelho) e a célula adjacente (por exemplo, sqrt (2) para células adjacentes na diagonal ou 1 caso contrário)
Atualizar
Quando os limites das células adjacentes estão fora dos limites da varredura, preciso calcular novos valores para as células adjacentes que respeitam as condições. As células adjacentes que não respeitam as condições serão iguais a "NA".
Por exemplo, se a posição de referência for c (1,1) em vez de c (5,5) usando a notação [linha, col], apenas o novo valor no canto inferior direito pode ser calculado. Assim, o resultado esperado será:
[,1] [,2] [,3]
[1,] NA NA NA
[2,] NA 0 NA
[3,] NA NA New_value
Por exemplo, se a posição de referência for c (3,1), apenas os novos valores nos cantos superior direito, direito e inferior direito poderão ser calculados. Assim, o resultado esperado será:
[,1] [,2] [,3]
[1,] NA NA New_value
[2,] NA 0 New_value
[3,] NA NA New_value
Aqui está minha primeira tentativa de fazer isso usando a função, focal
mas tenho alguma dificuldade para criar um código automático.
Selecionar células adjacentes
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 a célula adjacente estiver localizada no canto superior esquerdo da célula atual
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 a célula adjacente estiver localizada no canto médio superior da célula atual
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 a célula adjacente estiver localizada no canto superior esquerdo da célula atual
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 a célula adjacente estiver localizada no canto esquerdo da célula atual
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 a célula adjacente estiver localizada no canto direito da célula atual
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 a célula adjacente estiver localizada no canto inferior esquerdo da célula atual
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 a célula adjacente estiver localizada no canto inferior central da célula atual
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 a célula adjacente estiver localizada no canto inferior direito da célula atual
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))
. Como posso obter o resultado apenas das 8 células adjacentes da célula atual e não de toda a varredura? Aqui, o resultado deve ser: res <- matrix(c(7.42,0,0,0,0,0,0,0,0), nrow=3, ncol=3, byrow = T)
. Muito obrigado !
raster
pacote e afocal()
função: (p 90 documentação.) Cran.r-project.org/web/packages/raster/raster.pdf