使用后续图层填充光栅堆栈中的空白
Fill the gaps in raster stack using subsequent layers
假设我有一个光栅堆栈,每一层都有数据间隙。我想使用堆栈中接下来的两层来填充每一层的间隙:
library(raster)
r1 <- raster(ncol=20,nrow=20, xmn=0, xmx=20, ymn=0,ymx=20)
r1[] <- 1:20
r2 <- r3 <- r4 <- r5 <- r1
set.seed(0)
r1[sample(1:ncell(r1), size = 20)] <- NA
r2[sample(1:ncell(r2), size = 30)] <- NA
r3[sample(1:ncell(r3), size = 10)] <- NA
r4[sample(1:ncell(r4), size = 18)] <- NA
r5[sample(1:ncell(r5), size = 18)] <- NA
s <- stack(r1, r2, r3, r4, r5)
在这种情况下,r2 和 r3 将用于填充 r1 中的空白,依此类推。
不确定这是否是您想要的,但它会给您一个开始。我还是 R 的新手,所以可能还有另一种方法。
library(raster)
r1 <- raster(ncol=20,nrow=20, xmn=0, xmx=20, ymn=0,ymx=20)
r1[] <- 1:20
r2 <- r3 <- r4 <- r5 <- r1
set.seed(0)
r1[sample(1:ncell(r1), size = 20)] <- NA
r2[sample(1:ncell(r2), size = 30)] <- NA
r3[sample(1:ncell(r3), size = 10)] <- NA
r4[sample(1:ncell(r4), size = 18)] <- NA
r5[sample(1:ncell(r5), size = 18)] <- NA
s <- stack(r1, r2, r3, r4, r5)
for(i in 1:(nlayers(s) - 2) ){
s[[i]] <- merge( s[[i]], mask( s[[(i+1)]], s[[i]], inverse = TRUE))
s[[i]] <- merge( s[[i]], mask( s[[(i+2)]], s[[i]], inverse = TRUE))
}
MikeJewski 的解决方案可能有效,但 cover
函数专为此而设计,而且更直接。不清楚如何使用接下来的两层。均值:
for(i in 1:(nlayers(s) - 2) ){
s[[i]] <- cover( s[[i]], mean( s[[(i+1):(i+2)]], na.rm=TRUE))
}
或第一个最接近的(正如 MikeJewski 假设的那样):
for(i in 1:(nlayers(s) - 2) ){
s[[i]] <- cover( s[[i]], s[[(i+1)]])
s[[i]] <- cover( s[[i]], s[[(i+2)]])
}
这将是另一种但可能效率低下的方法:
f <- function(x) {
for(i in 1:((ncol(x)-2)) ){
x[is.na(x[,i]),i] <- x[is.na(x[,i]),i+1]
x[is.na(x[,i]),i] <- x[is.na(x[,i]),i+2]
}
x
}
ss <- calc(s, f)
假设我有一个光栅堆栈,每一层都有数据间隙。我想使用堆栈中接下来的两层来填充每一层的间隙:
library(raster)
r1 <- raster(ncol=20,nrow=20, xmn=0, xmx=20, ymn=0,ymx=20)
r1[] <- 1:20
r2 <- r3 <- r4 <- r5 <- r1
set.seed(0)
r1[sample(1:ncell(r1), size = 20)] <- NA
r2[sample(1:ncell(r2), size = 30)] <- NA
r3[sample(1:ncell(r3), size = 10)] <- NA
r4[sample(1:ncell(r4), size = 18)] <- NA
r5[sample(1:ncell(r5), size = 18)] <- NA
s <- stack(r1, r2, r3, r4, r5)
在这种情况下,r2 和 r3 将用于填充 r1 中的空白,依此类推。
不确定这是否是您想要的,但它会给您一个开始。我还是 R 的新手,所以可能还有另一种方法。
library(raster)
r1 <- raster(ncol=20,nrow=20, xmn=0, xmx=20, ymn=0,ymx=20)
r1[] <- 1:20
r2 <- r3 <- r4 <- r5 <- r1
set.seed(0)
r1[sample(1:ncell(r1), size = 20)] <- NA
r2[sample(1:ncell(r2), size = 30)] <- NA
r3[sample(1:ncell(r3), size = 10)] <- NA
r4[sample(1:ncell(r4), size = 18)] <- NA
r5[sample(1:ncell(r5), size = 18)] <- NA
s <- stack(r1, r2, r3, r4, r5)
for(i in 1:(nlayers(s) - 2) ){
s[[i]] <- merge( s[[i]], mask( s[[(i+1)]], s[[i]], inverse = TRUE))
s[[i]] <- merge( s[[i]], mask( s[[(i+2)]], s[[i]], inverse = TRUE))
}
MikeJewski 的解决方案可能有效,但 cover
函数专为此而设计,而且更直接。不清楚如何使用接下来的两层。均值:
for(i in 1:(nlayers(s) - 2) ){
s[[i]] <- cover( s[[i]], mean( s[[(i+1):(i+2)]], na.rm=TRUE))
}
或第一个最接近的(正如 MikeJewski 假设的那样):
for(i in 1:(nlayers(s) - 2) ){
s[[i]] <- cover( s[[i]], s[[(i+1)]])
s[[i]] <- cover( s[[i]], s[[(i+2)]])
}
这将是另一种但可能效率低下的方法:
f <- function(x) {
for(i in 1:((ncol(x)-2)) ){
x[is.na(x[,i]),i] <- x[is.na(x[,i]),i+1]
x[is.na(x[,i]),i] <- x[is.na(x[,i]),i+2]
}
x
}
ss <- calc(s, f)