要替换的项目数量不是替换长度的倍数“ - 循环中的区域功能

时间:2017-10-01 01:24:31

标签: r for-loop gis raster

我试图找出一个区域(美国)内每个多边形的物种数量,并将此结果存储在一个表格中,其中列数是美国物种总数,行数是总数该区域内的多边形数量。

为此,我尝试首先创建一个空矩阵,其中将存储结果,然后在本例“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”

我很感激任何帮助...

1 个答案:

答案 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]
}

现在代码运行正常。