gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 04:09:12 27 4
gpt4 key购买 nike

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

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com