将堆栈中具有相同值的单元格重新分配给另一个值
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
}
我正在尝试将堆栈中值为 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
}