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))
raster
pacote e afocal()
função: (p 90 documentação.) 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))
. 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 !Respostas:
A função
AssignValuesToAdjacentRasterCells
abaixo retorna um novo objeto RasterLayer com os valores desejados atribuídos a partir da entrada raster original . A função verifica se as células adjacentes da posição de referência estão dentro dos limites de varredura. Também exibe mensagens se algum limite estiver fora. Se você precisar mover a posição de referência, basta escrever uma iteração alterando a posição de entrada para c ( i , j ).Entrada de dados
Função
Executar exemplos
Exemplos de plotagem
Exemplo de figura
Nota:
NA
valores médios de células brancasfonte
Para um operador de matriz em uma matriz pequena, isso faz sentido e é tratável. No entanto, convém repensar sua lógica ao aplicar uma função como essa a uma grande varredura. Conceitualmente, isso realmente não acompanha na aplicação geral. Você está falando sobre o que tradicionalmente é chamado de estatística de bloco. No entanto, uma estatística de bloco é por natureza iniciada em um canto da varredura e substituindo blocos de valores, dentro de um tamanho de janela especificado, por um operador. Normalmente esse tipo de operador é para agregar dados. Seria consideravelmente mais tratável se você pensasse em termos de condições para calcular o valor central de uma matriz. Dessa forma, você pode facilmente usar uma função focal.
Lembre-se de que a função focal de varredura está lendo em blocos de dados que representam os valores focais na vizinhança definida com base na matriz passada para o argumento w. O resultado é um vetor para cada vizinhança e o resultado do operador focal é atribuído apenas à célula focal e não à vizinhança inteira. Pense nisso como pegar uma matriz em torno de um valor de célula, operando nela, atribuindo um novo valor à célula e depois passando para a próxima célula.
Se você garantir que na.rm = FALSE, o vetor sempre representará a vizinhança exata (ou seja, o mesmo vetor de comprimento) e será coagido a um objeto de matriz que pode ser operado dentro de uma função. Por causa disso, você pode simplesmente escrever uma função que leva o vetor esperado, coage em uma matriz, aplica sua lógica de notação de vizinhança e depois atribui um único valor como resultado. Essa função pode ser passada para a função raster :: focal.
Aqui está o que estaria acontecendo em cada célula com base em uma simples coerção e avaliação da janela focal. O objeto "w" seria essencialmente a mesma definição de matriz que seria aprovada no argumento w em focal. É isso que define o tamanho do vetor de subconjunto em cada avaliação focal.
Agora, crie uma função que possa ser aplicada ao focal e aplique a lógica acima. Nesse caso, você pode atribuir o objeto se como o valor ou usá-lo como uma condição em algo como "ifelse" para atribuir um valor com base em uma avaliação. Estou adicionando a declaração ifelse para ilustrar como alguém avaliaria várias condições da vizinhança e aplicaria uma condição de posição da matriz (notação da vizinhança). Nesta função fictícia, a coerção de x para uma matriz é completamente desnecessária e existe apenas para ilustrar como isso seria feito. Pode-se aplicar condições de notação de vizinhança diretamente ao vetor, sem coerção da matriz, porque a posição no vetor se aplicaria à sua localização na janela focal e permaneceria fixa.
E aplicá-lo a uma varredura
fonte
Você pode atualizar facilmente os valores de varredura subconjuntos de varredura usando a notação [linha, col]. Observe que a linha e a coluna começam no canto superior esquerdo da varredura; r [1,1] é o índice de pixels superior esquerdo er [2,1] é o abaixo de r [1,1].
fonte