2012-03-15 164 views
0

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

我现在想用补丁stat输出做一个光栅,即“perim.area.ratio”。因此,每个对应于丛1的单元格将获得与丛1相对应的perim.area.ratio值。为此,我从我的丛块栅格中创建了一个data.frame():lon, lat, layer(clumpID), cellID
我试图合并我的clump栅格data.frame与PatchStat输出使用patchID。但是,发生错误:

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

帮助文件(http://rgm2.lab.nig.ac.jp/RGM2/func.php?rd_id=SDMTools:PatchStat)表示:“一个带有ConnCompLabel标识的单个补丁的数据矩阵;矩阵可以是'asc'(adehabitat包),'RasterLayer'(光栅包)或'SpatialGridDataFrame'(sp包)“类的光栅。如果你正在使用RasterLayer(如果你使用'raster',你可能是),你可以避免必须转换为矩阵并返回。 – 2012-03-15 08:19:28

+0

Hi @RomanLustirk,感谢您的回复。是的,我正在使用'RasterLayer',当我检查我的栅格的属性时,它会在顶部显示它。但是,如果我只是放入栅格,它就不起作用,我收到错误信息......不知道为什么,但无法弄清楚这一点!干杯,亚当 – Adam 2012-03-15 09:59:17

+0

什么是错误信息? 'r < - raster(ncols = 12,nrows = 12); r [] < - round(runif(ncell(r))* 0.6); rc < - clump(r); PatchStat(rc)'适合我。 – jbaums 2012-03-15 13:01:56

回答

1

你编码的方式,将merge函数需要两个数据帧,同时拥有“层”字段一个“patchID”一栏,而实际上你打算层列映射的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值的所有单元的单元索引,并将该向量分配给对象not.na。所述sapply函数然后分配的not.na依次x每个值,并且执行大括号之间的东西(在此情况下仅返回的p行具有patchID等于x中发现的perim.area.ratio值)。 sapply函数返回这些值的向量,然后将其分配给rc的非NA单元。实质上,这是一个发现&替换操作,其中补丁号码被替换为其对应的perim.area.ratios

我应该提到,如果你有一个非常大的网格,这可能无法正常工作。