我尝试将值为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
答案 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
}