r - 要替换的项目数不是替换长度的倍数”——循环中的区域函数

标签 r for-loop gis raster

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

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

相关文章:

r - 强制绘图 fiddle 图不在零值上显示 fiddle

r - 在 mutate 中将参数传递给 pmap

Matlab:使用矩阵运算而不是 for 循环

javascript - 你如何在javascript中的for循环中更改函数名称

mysql - 我如何使用经度和纬度搜索最近的用户,同时在 MySQL 中以有效的方式按性别和年龄进行过滤?

java - 世风视线

r - Bash/Linux 在 .txt 文件中查找非 ASCII 字符并将其替换为 ASCII 字符

r - 在 dplyr 中选择一个范围内的记录

arrays - 赋值左侧的函数调用必须返回 Variant 或 Object,在两个数组中查找公共(public)值

gis - PROJ.4 库和 OSGB36