r - 替换栅格堆栈中所有图层的像素值
问题描述
我需要有关栅格堆栈的帮助。我有一个 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 函数?)
提前致谢。
解决方案
通常,在 R 中遇到此类问题的第一步是编写一个对向量进行操作的函数。或搜索现有的。我的第一个谷歌查询指出我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)))
并将两者结合起来。你可以做
一个)
x <- reclassify(s, cbind(3, NA))
z <- calc(x, fun=na.locf)
或者
二)
f <- function(v) {
v[v==3] <- NA
na.locf(v)
}
zz <- calc(s, f)
推荐阅读
- android - 带有加号的 Kotlin 多行字符串声明
- android - 弹出回到上一个片段时如何停止观察者自动观察数据?
- azure - 如何将 Microsoft.Azure.CognitiveServices.FormRecognizer v0.8.0-preview API 端点更改为 v.2.0.0?
- chart.js - 条形图标签对齐
- google-chrome-extension - 使用谷歌浏览器扩展 api 获取标题和正文
- hybris - 如何在 Smartedit 中编辑媒体
- pulseaudio - 在带有 Alsa/Pulseaudio 的无头 Ubuntu 18.04 服务器(无 X11)上运行 Pianobar,并通过 SSH 将音频流式传输到 Mac 笔记本电脑
- neo4j - Neo4j:如何创建具有两个新关系的新节点?
- java - 如何为我的使用 mysql、java7 并在 tomcat7 上运行的 web 应用程序创建一个 setup(.exe) 文件
- reactjs - 创建生产版本时出错“不包含默认导出”