我试图找出一个区域(美国)内每个多边形的物种数量,并将此结果存储在一个表格中,其中列数是美国物种总数,行数是总数该区域内的多边形数量。
为此,我尝试首先创建一个空矩阵,其中将存储结果,然后在本例“SDM.b”中调用的RasterBrick文件中的所有层(202)中创建一个循环(每个层=分布物种(x)),并计算栅格“regionRas”的区域统计数据,该栅格存储多边形,其中我划分了我感兴趣的区域。这些多边形在栅格“regionRas”中称为“Distritos”,在栅格“regionRas”please see this pic for info about those rasters中有一个名为“CODIGO”的唯一代码。
这是我的代码:
library(maptools)
library(sp)
library(geosphere)
library(raster)
#this is the empty matrix
SpeciesRegions <- matrix(NA, nrow=87, ncol=nlayers(SDM.b))
#here I am trying to fill that matrix
for(i in 1:nlayers(SDM.b))
{
SpeciesRegions[,i] <- zonal(clipped.spp.diversity.mask, regionsRas,fun='sum',digits=0, na.rm=TRUE)[,1]
}
#convert the matrix data to logical (true/false) data
SpeciesRegions <- SpeciesRegions > 0
预期输出将如下所示:
species 1 species 2 species 3
polygon 1 FALSE TRUE TRUE
polygon 2 TRUE FALSE FALSE
polygon 3 FALSE TRUE TRUE
但这是我在循环中得到的错误
“Error in SpeciesRegions[, i] <- zonal(clipped.spp.diversity.mask, regionsRas, :
number of items to replace is not a multiple of replacement length”
我很感激任何帮助...
答案 0 :(得分:1)
通过按照我在评论中描述的方式创建可重现的数据,我最终能够重现错误:
library(maptools)
library(sp)
library(geosphere)
library(raster)
# I've created reproducible data here
r <- raster(ncols=10, nrows=10)
r[] <- 1:ncell(r)
SDM.b <- stack(r, r, r)
clipped.spp.diversity.mask <- raster(ncols=10, nrows=10)
clipped.spp.diversity.mask[] <- runif(ncell(r)) * 1:ncell(r)
regionsRas <- r
regionsRas[] <- rep(1:5, each=20)
#this is the empty matrix
SpeciesRegions <- matrix(NA, nrow=87, ncol=nlayers(SDM.b))
#here I am trying to fill that matrix
for(i in 1:nlayers(SDM.b)){
SpeciesRegions[,i] <- zonal(clipped.spp.diversity.mask, regionsRas,fun='sum',digits=0, na.rm=TRUE)[,1]
}
Error in SpeciesRegions[, i] <- zonal(clipped.spp.diversity.mask, regionsRas, : number of items to replace is not a multiple of replacement length
这个错误信息通常可以非常简单,所以我检查了现有和替换值的维度:
zonal(clipped.spp.diversity.mask, regionsRas,fun='sum',digits=0, na.rm=TRUE)[,1]
[1] 1 2 3 4 5
SpeciesRegions[,i]
[1] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA [65] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
正如您所看到的,它们的长度非常不同,因此我发现错误应该不足为奇。
要修复它,我可以将空数据帧定义中的硬编码行长度更改为输入数据的长度:
#this is the empty matrix
SpeciesRegions <- matrix(NA, nrow=length(zonal(clipped.spp.diversity.mask, regionsRas,fun='sum',digits=0, na.rm=TRUE)[,1]), ncol=nlayers(SDM.b))
#here I am trying to fill that matrix
for(i in 1:nlayers(SDM.b)){
SpeciesRegions[,i] <- zonal(clipped.spp.diversity.mask, regionsRas,fun='sum',digits=0, na.rm=TRUE)[,1]
}
现在代码运行正常。