Суммарная сумма: работа с пикселем NA в растровых данных в R - PullRequest
0 голосов
/ 20 ноября 2018

У меня есть многоканальный растр, и я хочу рассчитать кумулятивные суммы каждого пикселя по всем полосам.Полосы включают в себя пиксели NA в разных местах, а функция cumsum в calc из растрового пакета записывает NA в последующих полосах, если она встречает значение NA в пикселе.Наконец, у меня осталось только NA пикселей в последней совокупной сумме.Я изменил NA на ноль, но это приводит к недооценке значений.

Можно ли использовать предварительное значение для NA?Или, может быть, даже среднее значение предварительного и следующего значения?

library(raster)
raster <- stack("inputPath")
cumulative_sum <- calc(raster, cumsum)

вот пример того, что я имею в виду

input band 1
1    4    7
NA   5    8
3    6   NA

input band 2
2   NA   NA
3    6    9
4    7   10

input band 3
1    4    7
2    5    8
3    6    9

result with calc and cumsum
4    NA   NA
NA   16   25
10   19   NA


desired output (last resulting band <- band1 + band2+ band3)
4    12   21
5    16   25
10   19   19

1 Ответ

0 голосов
/ 21 ноября 2018

Используя предложение @Niek, вы можете реализовать его следующим образом:

library(raster)
library(zoo)

# Generate example data

set.seed(42)
r <- raster(ncols=3,nrows=3)

r3 <- do.call(stack,replicate(3,setValues(r,sample(c(runif(ncell(r)),NA),ncell(r),replace = T))))

f <- function(ii){

  if(is.na(ii[1])) ii[1] <- 0

  cumsum(na.locf(ii))

}

r3c <- calc(r3,fun = f)

Как видите, любые значения NA в слое 1 установлены на 0, так как нет значениянести вперед.Вы также можете сделать это до calc и удалить условие if из f.

. Чтобы проверить, мы подготовим график и вы увидите, что NA пропали:

plot(is.na(r3),main=paste('Input',c(1:3)))

enter image description here

plot(is.na(r3c),main=paste('Cumsum',c(1:3)))

enter image description here

...