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

时间:2015-11-04 17:46:52

标签: r raster

我尝试将值为0的堆栈中的单元格重新分配给值为-9999。如果所有三个光栅对于相同的单元具有值0,则要求是在堆叠的3个栅格中,然后在该像素位置处为堆叠中的所有层指定值-9999。我尝试用for循环来做这个,但我认为我的方法1)效率不高2)它不起作用。

任何人都可以帮助我理解一种有效的方法来重新分配像素值,条件是该像素位置中的所有CELLS具有相同的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
    }
  }
}

感谢您的任何指示和时间,

Leah

1 个答案:

答案 0 :(得分:1)

一般方法是编写一个函数,该函数将在矩阵上运行,其中每行是一个单元格,每列都是一个层。然后在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
}