0

我有一个土地覆盖栅格文件,我已将其缩减为仅包含树木覆盖单元格。我clump在 raster 包中使用了 clump() 将森林的连续区域聚集在一起。这使所有相互接触的单元格都具有相同的 ID,因为它们是同一个补丁的一部分。
然后我想找出每个丛的 PatchStat(),我通过将丛栅格转换为 as.matrix 来做到这一点。我试图让 PatchStat() 对栅格执行此操作,但它仅在它位于矩阵中时才有效。

我现在想用补丁统计输出制作一个栅格,即“perim.area.ratio”。因此,对应于丛 1 的每个单元格都将获得与丛 1 对应的 perim.area.ratio 值。为此,我从我的丛栅格中制作了一个 data.frame(),它具有:lon, lat, layer(clumpID), cellID我尝试使用layerpatchID
将我的丛集栅格 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"))
4

1 回答 1

2

按照您的编码方式,该merge函数期望两个数据帧都具有“层”字段“补丁ID”列,而实际上您打算将 clumpdf 的层列映射到 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 值的所有单元格的单元格索引,并将此向量分配给 object not.na。然后该sapply函数将 的每个值依次分配not.nax,并在花括号之间执行操作(在这种情况下,它只返回在等于perim.area.ratio的行中找到的值p)。该函数返回这些值的向量,然后将其分配给 的非 NA 单元格。本质上,这是一个查找和替换操作,其中补丁编号被替换为对应的.patchIDxsapplyperim.area.ratiorcperim.area.ratios

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

于 2012-03-15T13:23:10.900 回答