2017-10-01 7 views
1

地域(アメリカ)内のポリゴンあたりの種の数を調べ、この結果を数値of columnsはアメリカの種の総数であり、行数はその領域内のポリゴンの総数です。置き換えられるアイテムの数は置換の長さの倍数ではありません " - ループのゾーン関数

この場合、結果が格納される空の行列を最初に作成し、この例では「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

リンクありがとうございます。私は私の質問を編集して、それがうまくいくかどうかを確認しました。私は残念ながら、データを追加することはできません、私のすべての入力はかなり大きいラスターファイルです。 –

+0

改善をいただきありがとうございます。あなたはまだデータを追加することができます。これを行う方法は、組み込みのデータ、安定した評判の良いWebサイトから簡単にオンラインでダウンロードしたデータファイル、またはコード内で生成されたデータを使用することです。私は以下の答えでそうしました。乾杯。 –

+1

ありがとうございました!!!あなたの応答は、再現可能なデータを作成する方法の非常に明確な例です。 –

答えて

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 

あなたが見ることができるように、それらは非常に異なる長さであり、したがって、私はその誤りを得たことは驚きではないはずです。それを修正する

、Iは、入力データの長さに空のデータフレームの定義でハードコードされた行の長さを変更することができる:

#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] 
} 

今コードは正常に実行されます。

+1

は素晴らしい作品です。おかげです。 –

+0

@Tac_For happy to help –

関連する問題