2017-05-08 3 views
1

私は興味のあるデータ(種の存在)の値が1で残りが0(不在)またはNAのラスタを持っています。 私はmagrittrとdplyrを使用しようとしています。パイプの中で、すべての0の値をNAに変更したいので、後でラスタをトリミングして種があるデータの最小座標と最大座標を取得できます(value = 1)%>%パイプ内のラスタ値を変更します

しかし、NAに値0を変更すると、私は通常のようなものとするだろう何かである:

raster[values(raster) == 0] <- NA 

私はmagrittrで、「右から左に」、トラブルの操作のようなものをやってを持っている(ことができます彼らはやる?)。私はnames() <-setNames()によってexchanchedすることができること、またはあなたが操作記号を使用するために ``記号を使用することができることを学びました(すなわち:raster %>% * (raster2)が別のラスタで乗算する) `

は作業同等の結果を取得する方法はありますパイプで?

ありがとうございました!

+3

関数 'zero_to_na <-function(x){x [values(x)== 0] < - NA; x} 'を作成し、あなたのパイプでそれを使用してください:' raster%>%zero_to_na'。結局、Rは関数型言語です。意図をより明確にする関数を書くことを恐れないでください。 – MrFlick

+0

すごくいいですよね!ありがとう@MrFlick、それは完全に動作します。 しかし、すでに実装されている方法があるのだろうかと疑問に思っています。もし私が何かを見逃しているのか、パイプのために翻訳するのが簡単ではないのか分かりません。右操作から左操作) –

答えて

2

一つの方法は、使用することですraster::reclassify

library(raster) 
library(magrittr) 
r <- raster(matrix(0:3, 2)) 

r %>% reclassify(c(0, 0, NA), right=NA) 

また、これは(とにかく、大きなラスタに!)@ MrFlickの素敵なzero_to_naの提案よりもほんの少し速くすることができ、場合にあなたは多くのをやっていますこのもの。それは明らかにそれほどエレガントではないというトレードオフです。

r <- raster(matrix(rbinom(1e6, 1, 0.5), 1e3)) 
microbenchmark::microbenchmark(
    this=r %>% reclassify(c(0, 0, NA), right=NA), 
    that=r %>% zero_to_na) 

Unit: milliseconds 
expr  min  lq  mean median  uq  max neval cld 
this 21.77720 22.85843 32.48079 25.05024 26.05527 168.1101 100 a 
that 29.46083 31.37556 56.32881 33.48350 38.05476 202.8740 100 b 
+0

これはまさに私が探していたものです。実際には、私は潜水艦で試していたが、何らかの理由で私はそれを設定することはできませんでした。それは私のために十分なエレガントです!ありがとう! –

関連する問題