我需要栅格堆栈方面的帮助。 我有一个365层栅格堆栈(对应于一个水文年),我想用值3替换像素,最后一个上一个图层的值替换为其他值。 例如,对于特定的像素,我具有前10个提供值的层: 1,1,2,3,3,3,3,2,1,1。 在这种情况下,值为3的层应替换为2,这是“ 3窗口”之前的最后一个值,该值不同于3。 应该对每个像素的所有层(显然,第一个除外)执行此操作。 任何想法? 我只是将栅格转换成矩阵,然后处理矩阵,但这需要很多时间。 假设vel_3D_snow_P4是我的矩阵(从栅格中检索),其中我有365行(天)和超过400000列(像素),我编写了这段代码:
vel_3D_snow_P4_back=matrix(nrow=nrow(vel_3D_snow_P4),ncol=ncol(vel_3D_snow_P4))
for (i in 1:ncol(vel_3D_snow_P4)){
y <- which(vel_3D_snow_P4[,i]==3)
startIndex <- y[!(y-1) %in% y]
stopIndex <- y[!(y+1) %in% y]
matrix=matrix(nrow=length(startIndex),ncol=2)
matrix[,1]=startIndex
matrix[,2]=stopIndex
new_vector_back=vel_3D_snow_P4[,i]
for (j in 1:nrow(matrix)){
if (matrix[j,1]==1) next
new_vector_back[matrix[j,1]:matrix[j,2]]=new_vector_back[matrix[j,1]-1]
}
vel_3D_snow_P4_back=cbind(vel_3D_snow_P4_back,new_vector_back)
print(c("fine",toString(i)))
}
但是,正如您可以想象的那样,拥有众多像素是不可能的!这就是为什么我要通过维护栅格格式(也许使用calc函数?)来寻求解决方案/想法的原因
谢谢。
答案 0 :(得分:0)
通常,在R中遇到此类问题的第一步是编写对向量进行运算的函数。或搜索现有的一个。我的第一个Google查询将我指向zoo::na.locf
library(zoo)
x <- c(1,1,2,3,3,3,3,2,1,1)
x[x==3] <- NA
na.locf(x)
# [1] 1 1 2 2 2 2 2 2 1 1
然后创建示例栅格数据
library(raster)
r <- raster(ncol=10, nrow=10)
s <- stack(lapply(c(1,2,3,3,4), function(i) setValues(r, i)))
并结合两者。你可以做
A)
x <- reclassify(s, cbind(3, NA))
z <- calc(x, fun=na.locf)
或
B)
f <- function(v) {
v[v==3] <- NA
na.locf(v)
}
zz <- calc(s, f)