Preencher as lacunas usando os vizinhos mais próximos

8

Quero preencher os valores de NA usando os valores médios dos vizinhos mais próximos:

r <- raster(matrix(1:16, nrow=8, ncol=8))
r[r==12] <- NA
Geo-sp
fonte

Respostas:

14

Você pode preencher os valores de NA usando a função focal com o argumento na.rm definido como FALSE e pad como TRUE.

library(raster)
  r <- raster(matrix(1:16, nrow=8, ncol=8))
  r[r==12] <- NA

Função para substituir o valor focal pela média de uma janela 3x3 se NA. Se o tamanho da janela aumentar, o valor do índice [i] também precisará ser alterado (por exemplo, para uma janela de 5x5, o índice seria 13).

fill.na <- function(x, i=5) {
  if( is.na(x)[i] ) {
    return( round(mean(x, na.rm=TRUE),0) )
  } else {
    return( round(x[i],0) )
  }
}  

Passe a função fill.na para raster :: focal e verifique os resultados. O argumento pad cria linhas / colunas virtuais de valores de NA para manter o comprimento do vetor constante ao longo das bordas da varredura. É por isso que sempre podemos esperar que o quinto valor do vetor seja o valor focal em uma janela 3x3, assim, o índice i = 5 na função fill.na.

r2 <- focal(r, w = matrix(1,3,3), fun = fill.na, 
            pad = TRUE, na.rm = FALSE )

as.matrix(r)
as.matrix(r2)
Jeffrey Evans
fonte
Obrigado, acho que essa função leva a média de todos os 3 por 3 pixels e suaviza toda a varredura. Quero preencher apenas as lacunas da célula de NA.
Geo-sp
Sim, mas você pode escrever sua própria função que substitui apenas os valores de NA. Nesse caso, na.rm seria FALSE. É para isso que serve o argumento divertido.
Jeffrey Evans
Obrigado pela resposta! você sabe como posso aplicar isso a uma pilha raster? Eu quero usar isso para cada camada da pilha. Obrigado!
Geo-sp
Você terá que percorrer a pilha usando um loop for e um índice e substituir cada varredura na pilha (por exemplo, r [[1]] <- my.function (r [[1]]) ou criar um nova pilha com cada varredura preenchida.
Jeffrey Evans
1
Se você quiser fazer isso em R, é provável que precise executar várias passagens para preencher todas as lacunas. No entanto, essa não é uma resposta muito satisfatória para preencher áreas que representam grandes vazios de dados. Uma abordagem de interpolação certamente produziria melhores resultados. Sem codificar um modelo específico em R, não há soluções prontas para uso. Existe uma rotina de preenchimento de nodata baseada em interpolação disponível no SAGA GIS.
11117 Jeffrey Evans