我试图找出一个区域(美国)内每个多边形的物种数量,并将此结果存储在一个表中,其中列数是美国的物种总数,行数是总数该区域内的多边形数量。
为此,我尝试首先创建一个空矩阵,用于存储结果,然后在本例中称为“SDM.b”的 RasterBrick 文件中创建一个遍历所有层 (202) 的循环(每个层 = 分布species (x) ),并计算栅格“regionRas”的区域统计数据,该栅格存储了我划分感兴趣区域的多边形。这些多边形在栅格“regionRas”中称为“Distritos”,并且在栅格“regionRas”中具有称为“CODIGO”的唯一代码 please see this pic for info about those rasters .
这是我的代码:
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”
我将不胜感激任何帮助...
最佳答案
通过按照我在评论中描述的方式创建可重现的数据,我最终能够重现错误:
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]
}
现在代码运行正常。
关于r - 要替换的项目数不是替换长度的倍数”——循环中的区域函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46508428/