2016-12-03 5 views
0

私は、同じエクステントなどの2つの環境ラスタと、モデル結果のデータフレーム(env1とenv2のすべての可能な組み合わせを含む)を持っています。私は、各セルのモデル結果でいっぱいの3番目のラスタを作成しようとしています。ラスタをクエリして結果ラスタを作成する

library(raster) 
## Mock env rasters 
env.param1 <- seq(1:100) 
env.param2 <- seq(101:200) 

ext <- extent(1,10,1,10) 
env1 <- raster(ext,nrow=10,ncol=10) 
values(env1) <- env.param1 
env2 <- raster(ext,nrow=10,ncol=10) 
values(env2) <- env.param2 

## Mock model results 
param.set <- expand.grid(env.param1,env.param2) 
res.v <- seq(10001:20000) 
res <- cbind(param.set, res.v) 
res.rast <- raster(ext, nrow=10, ncol=10) 
## 
for(i in 1:ncell(env1)){ 
    res.rast[i] <- res[which(res$Var1==env1[i] & res$Var2==env2[i]),"res.v"] 
} 

これが動作するように表示されますが、env*の値は私の実際のデータセットに起こるであろうresに発生していない場合、それは失敗します。私は解決策を思いついたが、それは遅いようだ。

for(i in 1:ncell(env1)){ 

    res.rast[i] <-res[which(ifelse(abs(res$Var1-env1[i])==min(abs(res$Var1-env1[i])),TRUE,FALSE) 
      & ifelse(abs(res$Var2-env2[i])==min(abs(res$Var2-env2[i])),TRUE,FALSE)),"res.v"] 
} 

Aにこれを最適化する方法はあります)私は(私は私の古いものより225X高解像度で新しいデータセットを持っている)env*ラスタ高い解像度を使用して速度を上げますか? B)分析にもっと多くのパラメータを含めると、どのように拡大縮小できますか?

答えて

0

これは動作するはずです:

for(env1ind in unique(param.set$Var1)) { 
    for(env2ind in unique(param.set$Var2)) { 

    cells   <- which(env.param1 == env1ind & env.param2 == env2ind) 
    res.rast[cells] <- as.numeric(res[which(res$Var1 == env1ind & res$Var2 == env2ind),][3]) 

    } 
} 
を各画素にサイクリングよりも高速でなければなりませんが、あなたの「作業」ソリューションは私にエラーを与えるので、私はテストすることはできません。

しかし、これは効率的でも最適化もされていません。大きな画像がある場合は、あらかじめメモリ内のすべてのデータをvaluesにロードする必要があります。

"モデル"が複雑でない(計算コストが高い)場合は、raster::stackですべての入力ラスタをまとめてから、calcを使用してモデルを適用することを検討します。 これは "イメージブロック"で作業し、必要に応じて並列処理を使用できるようにします。

HTH

関連する問題