我有一个土地覆盖的光栅文件,我已经减少了只包含树盖细胞。我已经在栅格包中使用了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"))
答案 0 :(得分:2)
你编码它的方式,merge
函数期望两个数据帧同时具有'layer'字段和 a'patchID'列,而实际上你打算将clumpdf的layer列映射到ps.data的patchID列。您需要使用by.x
和by.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.na
。 sapply
函数然后将not.na
的每个值依次分配给x
,并执行大括号之间的内容(在这种情况下,它只返回在perim.area.ratio
中找到的值p
patchID
行x
等于sapply
的行。 perim.area.ratio
函数返回这些rc
值的向量,然后将其分配给perim.area.ratios
的非NA单元格。从本质上讲,它是一个发现&amp;替换操作,其中补丁号由相应的{{1}}替换。
我应该提一下,如果你有一个非常大的网格,这可能不起作用。