我有两个相同范围的环境栅格等,以及模型结果的数据帧(其中包含env1和env2的所有可能组合)。我正在尝试为每个单元格创建一个填充模型结果的第三个栅格。
library(raster)
## Mock env rasters
env.param1 <- seq(1:100)
env.param2 <- seq(101:200)
ext <- extent(1,10,1,10)
env1 <- raster(ext,nrow=10,ncol=10)
values(env1) <- env.param1
env2 <- raster(ext,nrow=10,ncol=10)
values(env2) <- env.param2
## Mock model results
param.set <- expand.grid(env.param1,env.param2)
res.v <- seq(10001:20000)
res <- cbind(param.set, res.v)
res.rast <- raster(ext, nrow=10, ncol=10)
##
for(i in 1:ncell(env1)){
res.rast[i] <- res[which(res$Var1==env1[i] & res$Var2==env2[i]),"res.v"]
}这看起来是有效的,但是当env*中的值没有出现在res中时,它就失败了,这将发生在我的实际数据集中。我已经想出了一个解决方案,但它似乎很慢。
for(i in 1:ncell(env1)){
res.rast[i] <-res[which(ifelse(abs(res$Var1-env1[i])==min(abs(res$Var1-env1[i])),TRUE,FALSE)
& ifelse(abs(res$Var2-env2[i])==min(abs(res$Var2-env2[i])),TRUE,FALSE)),"res.v"]
}有没有办法优化这一点,以提高速度,因为我使用更高分辨率的env*栅格(我有一个新的数据集,分辨率比我的旧数据集高225倍)?B)当我开始在我的分析中包括更多的参数时,我如何扩展?
发布于 2016-12-05 04:24:53
这应该是可行的:
for(env1ind in unique(param.set$Var1)) {
for(env2ind in unique(param.set$Var2)) {
cells <- which(env.param1 == env1ind & env.param2 == env2ind)
res.rast[cells] <- as.numeric(res[which(res$Var1 == env1ind & res$Var2 == env2ind),][3])
}
}而且应该比在像素上循环更快,但是我不能测试,因为你的“工作”解决方案给了我一个错误。
然而,这既不是高效的,也不是优化的。如果你有很大的图像,必须事先通过values加载内存中的所有数据可能会有问题。
如果你的“模型”并不复杂(即计算成本很高),我会考虑通过raster::stack将所有的输入栅格放在一起,然后使用calc来应用模型。这将允许您通过“图像块”工作,并在需要时使用并行处理。
HTH
https://stackoverflow.com/questions/40944552
复制相似问题