如何更改栅格内部循环中的值

时间:2014-03-23 20:56:11

标签: r loops raster

我有森林的航拍图像,我需要计算碎片指数。 我知道如何为任何单个图片执行此操作,但我想要使用循环,因为它是一堆。

# required libraries
library(raster)
library(SDMTools)

所需的索引值是元素编号11.但在我提取此值之前,我需要将所有值替换为“1”(从原始范围1-100开始)

# Individual raster can be done like this:
x <- raster(forest_cov[1])
x[x > 0] = 1
PatchStat(x)[11]


# I have tried this loop but it is not working
rast<-numeric(41)
for (i in 1:41) {
rast[i] <- PatchStat(raster(forest_cov[i][forest_cov[i] > 0 == 1]))[11]
                }

问题是我不知道如何将栅格中的所有值替换为1 (内部代码)。我做错了什么?

1 个答案:

答案 0 :(得分:1)

要弄清楚为什么你的代码没有返回预期的结果,你应该从内到外运行你的代码块。例如,forest_cov[i] > 0 == 1是否会返回您为光栅1返回的内容? (我怀疑没有,因为根据你的评论,forest_cov是一个字符向量,因此元素i与0的逻辑比较是不合理的。)但是,如果是这样,forest_cov[i][forest_cov[i] > 0 == 1]回报你的期望,等等。

以下是我如何处理这个问题。

准备一些假数据:

# Write out three fake rasters to temp files
writeRaster(stack(replicate(3, raster(matrix(runif(100), nc=10)))), 
            {f <- tempfile()}, bylayer=TRUE, format='ascii')

# Filenames of these fake rasters
rasters <- paste0(f, '_', 1:3, '.asc')

计算每个栅格的frac.dim.index(即PatchStat结果的第11个元素):

sapply(rasters, function(x) {
  require(SDMTools)
  PatchStat(raster(x) >= 0.1)[11]
})

或者,如果角色向量中引用的所有栅格具有一致的范围和维度,则可以按如下方式对堆栈执行操作:

s <- stack(rasters) >= 0.1
sapply(seq_len(nlayers(s)), function(i) PatchStat(s[[i]])[11])