将堆栈中具有相同值的单元格重新分配给另一个值

Reassigning a cells in a stack with the same value to another value

我正在尝试将堆栈中值为 0 的单元格重新分配为值 -9999。要求是在 3 个栅格的堆栈中,如果所有三个栅格的同一单元格的值为 0,则在该像素位置为堆栈中的所有图层分配一个 -9999 的值。我曾尝试使用 for 循环执行此操作,但我认为我的方法 1) 效率不高且 2) 不起作用。

任何人都可以帮助我理解一种有效的方法来重新分配像素值,其标准是该像素位置中的所有单元格都具有相同的 0 值吗?我确定我的方法不是最有效的。

#create some rasters
library(raster)
#create a raster 
myRaster1 <- raster(nrow=5, ncol=5)
#assign some random data to the raster
myRaster1[]<- 1:ncell(myRaster1)
values(myRaster1) <- 0:24
#add some values 0
myRaster1[2:6] <- 0

#create a raster 2
myRaster2 <- raster(nrow=5, ncol=5)
#assign some random data to the raster
myRaster2[]<- 1:ncell(myRaster1)
values(myRaster2) <- 0:24
myRaster2[2:6] <- 0

#create a raster
myRaster3 <- raster(nrow=5, ncol=5)
#assign some random data to the raster
myRaster3[]<- 1:ncell(myRaster1)
values(myRaster3) <- 0:24
myRaster3[2:6] <- 0

newStack <- stack(myRaster1,myRaster2,myRaster3)

#calculate rows and columns for loop
rows <- nrow(newStack)
cols <- ncol(newStack)

for (i in rows) {
  for (j in cols){
  if ((newStack[[1]][i,j] == 0) && (newStack[[2]][i,j] == 0) && (newStack[[3]][i,j] == 0)){
  print("this pixel has a value of 0 in all three layers in the stack")
  #assign pixels to -9999
    }
  }
}

感谢您的指导以及您抽出宝贵的时间进行回复,

利亚

一般的方法是编写一个函数来对矩阵进行操作,其中每一行是一个单元格,每一列是一个层。然后在 calc 中使用该函数(在某些情况下 overlay 更容易)。

library(raster)
# example data
r1 <- raster(nrow=5, ncol=5)
values(r1) <- 1:25
r1[2:6] <- 0
r2 <- r3 <- r1  
s <- stack(r1, r2, r3)

f <- function(x) {
    x[rowSums(x == 0) == 3, ] <- NA
    x
}

z <- calc(s, f)

如果s中没有负值,那么函数可以更简单

f <- function(x) {
    x[rowSums(x) == 0, ] <- NA
    x
}