使用R中的SDMTools创建具有PatchStat值的栅格

时间:2012-03-15 05:55:33

标签: r merge raster spatstat

我有一个土地覆盖的光栅文件,我已经减少了只包含树盖细胞。我已经在栅格包中使用了clump来将clump()聚集在森林的连续区域中。这使得所有细胞彼此接触相同的ID,因为它们是同一补丁的一部分 然后我想找出每个丛的PatchStat(),我将clump栅格转换为as.matrix。我试图让PatchStat()对栅格执行此操作,但只有在矩阵中才能生效。

我现在想要制作带有补丁统计输出的栅格,即“perim.area.ratio”。因此,对应于clump 1的每个单元格将获得与clump 1对应的perim.area.ratio值。为此,我从我的clump栅格中创建了一个data.frame(),其中包含:lon, lat, layer(clumpID), cellID。 /> 我尝试使用图层 patchID 将我的clump栅格data.frame与PatchStat输出合并。但是,会发生错误:

  

fix.by(by.x,x)出错:'by'必须指定有效列。

任何想法我怎么能以另一种方式做到这一点,或为什么这些列无效?代码如下。

clump <- raster(file.choose())
library(SDMTools)
clumpval <- rasterToPoints(clump)
clumpcell <- cellFromXY(clump, clumpval[, c('x', 'y')] )
clumpdf <- data.frame(clumpval, clumpcell)
ps.data <- PatchStat(as.matrix(clump))
merged.data.all <- merge(clumpdf, ps.data1, by=c("layer", "patchID"))

1 个答案:

答案 0 :(得分:2)

你编码它的方式,merge函数期望两个数据帧同时具有'layer'字段 a'patchID'列,而实际上你打算将clumpdf的layer列映射到ps.data的patchID列。您需要使用by.xby.y参数。

正确的电话会是:

merged.data.all <- merge(clumpdf, ps.data, by.x='layer', by.y="patchID")

然而,还有另一种简单的方法可以将细胞分配给它们的丛perim.area.ratio

library(raster)
library(SDMTools)

# create a random raster
r <- raster(ncols=200, nrows=200)
r[] <- rbinom(ncell(r), 1, 0.5)

# clump it
rc <- clump(r)

# get patch stats
p <- PatchStat(rc)

# Replace each non-NA value of rc with the corresponding clump perim.area.ratio.
not.na <- Which(!is.na(rc), cells=TRUE)
rc[not.na] <- sapply(rc[not.na], function(x) {
  p[p$patchID==x, 'perim.area.ratio']
})

要为你分解(如果你不是特别熟悉apply函数),最后一位首先识别具有非NA值的所有单元格的单元格索引,并将此向量分配给对象not.nasapply函数然后将not.na的每个值依次分配给x,并执行大括号之间的内容(在这种情况下,它只返回在perim.area.ratio中找到的值p patchIDx等于sapply的行。 perim.area.ratio函数返回这些rc值的向量,然后将其分配给perim.area.ratios的非NA单元格。从本质上讲,它是一个发现&amp;替换操作,其中补丁号由相应的{{1}}替换。

我应该提一下,如果你有一个非常大的网格,这可能不起作用。