2016-09-07 3 views
1

セル番号に基づいてラスタをサブセット化しようとしています。私はセル番号のベクトルを提供し、セル番号ベクトルで参照されているセルの元のセル値をラスタに戻したいと思います。私はrasterFromCells()関数を試しましたが、これはセル番号の間を補間するように見え、値を返さず、むしろセル番号を返します。私が試した:Rのセル番号でラスタをサブセット化する方法は?

がどのように細胞数2、20と200とNAなど他のすべてのセルについてfooの値を持つラスタレイヤを返すことができ

#original raster loaded with 400 sample values ranging from 1:24 
foo <- raster(ncol=20, nrow=20) 
foo[] <- sample(seq(1,24),400,replace = TRUE) 
#vector of desired cell numbers 
my.pts <- c(2,20,200) 
#rasterFromCells attempt 
bar<-rasterFromCells(foo, my.pts, values=TRUE) 

+0

どのセルに値を設定しますか? 'my.pts'にないすべてのセルをNAに設定することについて質問していますか? – aichao

+0

ご質問ありがとうございます。はい、すべての非my.ptsセルをNAに設定すると動作します。 – alaybourn

答えて

1

あなたはfooのものセル場所とNAに設定し、他のすべてのセル値に値に置き換えmy.ptsで唯一のセル位置での値で新しいラスタを作成したい場合は、あなただけに持っている:

  1. fooと同じサイズのラスタ(つまり、bar)を作成します。
  2. 使用bar[my.pts] <- foo[my.pts]

例えばNA秒でそれを埋める:同じ結果を達成するために

library(raster) 
set.seed(123) ## for reproducible results 
foo <- raster(ncols=20, nrows=20) 
foo[] <- sample(seq(1,24),400,replace = TRUE) 
#vector of desired cell numbers 
my.pts <- c(2,20,200) 

## create raster the same size as foo filled with NAs 
bar <- raster(ncols=ncol(foo), nrows=nrow(foo)) 
bar[] <- NA 
## replace the values with those in foo 
bar[my.pts] <- foo[my.pts] 

foo[my.pts] 
##[1] 19 23 14 

bar[] 
## [1] NA 19 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA 23 NA NA NA NA NA NA NA NA NA NA NA 
## [32] 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 
## [63] 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 
## [94] 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 
##[125] 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 
##[156] 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 
##[187] NA NA NA NA NA NA NA NA NA NA NA NA NA 14 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA 
##[218] 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 
##[249] 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 
##[280] 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 
##[311] 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 
##[342] 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 
##[373] 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 

別のアプローチは、barfooをコピーしていないのすべてのセルの位置を設定することですmy.pts~NAs:

bar <- foo 
bar[setdiff(1:ncell(foo),my.pts)] <- NA 
1

rasterFromCellsの利点は、希望のクロップドバージョンのみを含むため、より小さなラスタを返すことです。

だから、あなたが何をする必要があるか新しいもの(R2)という事実によって緩和され、新しいもの(R2)、再びあなたの最初のラスタ(R)の値を供給することです元の細胞数を返す:

r <- raster(ncols=100, nrows=100) 
r[] <- rnorm(ncell(r)) 

cells <- c(3:5, 210) 

r2 <- rasterFromCells(r, cells, values=TRUE) 
ini_cells <- getValues(r2) 

単にインデックスに従って値を養う:

r2[] <- r[ini_cells] 

これは24 Cのラスタをもたらします10'000の代わりにells!

c(ncell(r), ncell(r2)) 

は、私たちは結果を比較してみましょう:

data.frame(Orig=getValues(r)[cells], New=getValues(r2)[ini_cells %in% cells]) 
      [,1]  [,2] 
[1,] -0.5081512 -0.5081512 
[2,] -0.8799739 -0.8799739 
[3,] 0.3722788 0.3722788 
[4,] -0.7661364 -0.7661364 

注意:あなたはNAに他のすべてを設定したかったです。

r2[!ini_cells %in% cells] <- NA 
head(getValues(r2)) 
-0.5081512 -0.8799739 0.3722788   NA   NA   NA 
関連する問題