0

私は土地被覆のラスター ファイルを持っており、樹木被覆セルだけを含むように縮小しました。私はclumpラスター パッケージで使用して、隣接する森林の領域をまとめて clump() しました。これにより、互いに接触しているすべてのセルが同じパッチの一部であるため、同じ ID が与えられます。
次に、クランプ ラスターを as.matrix に変換して、各クランプの PatchStat() を計算します。PatchStat() を取得してラスターに対してこれを実行しようとしましたが、マトリックス内にある場合にのみ機能します。

ここで、パッチ統計出力、つまり「perim.area.ratio」を使用してラスターを作成したいと考えています。したがって、クランプ 1 に対応する各セルは、クランプ 1 に対応する perim.area.ratio 値を取得します。これを行うために、クランプ ラスターから data.frame() を作成しましたlon, lat, layer(clumpID), cellIDlayerpatchID
を使用して、クランプ ラスター data.frame を PatchStat 出力とマージしようとしました。ただし、エラーが発生します。

fix.by(by.x, x) のエラー:「by」は有効な列を指定する必要があります。

これを別の方法で行う方法、またはこれらの列が有効でない理由はありますか? 以下のコード。

clump <- raster(file.choose())
library(SDMTools)
clumpval <- rasterToPoints(clump)
clumpcell <- cellFromXY(clump, clumpval[, c('x', 'y')] )
clumpdf <- data.frame(clumpval, clumpcell)
ps.data <- PatchStat(as.matrix(clump))
merged.data.all <- merge(clumpdf, ps.data1, by=c("layer", "patchID"))
4

1 に答える 1

2

あなたがそれをコーディングした方法では、merge関数は両方のデータフレームに「レイヤー」フィールド「パッチID」列の両方があることを期待していますが、実際には clumpdf のレイヤー列を ps.data の patchID 列にマップするつもりです. by.xby.y引数を使用する必要があります。

正しい呼び出しは次のようになります。

merged.data.all <- merge(clumpdf, ps.data, by.x='layer', by.y="patchID")

ただし、セルにその塊を割り当てる別の簡単な方法がありperim.area.ratioます。

library(raster)
library(SDMTools)

# create a random raster
r <- raster(ncols=200, nrows=200)
r[] <- rbinom(ncell(r), 1, 0.5)

# clump it
rc <- clump(r)

# get patch stats
p <- PatchStat(rc)

# Replace each non-NA value of rc with the corresponding clump perim.area.ratio.
not.na <- Which(!is.na(rc), cells=TRUE)
rc[not.na] <- sapply(rc[not.na], function(x) {
  p[p$patchID==x, 'perim.area.ratio']
})

(関数に特に精通していない場合に備えてapply) 分解するために、この最後のビットは、最初に非 NA 値を持つすべてのセルのセル インデックスを識別し、このベクトルを object に割り当てますnot.na。次に、sapply関数は の各値をnot.naに順番に代入xし、中かっこの間を実行します (この場合perim.area.ratio、 の行で見つかった値が にp等しいpatchIDだけを返しますx)。このsapply関数はこれらの値のベクトルを返しperim.area.ratio、これが の非 NA セルに割り当てられrcます。要するに、これは検索と置換の操作であり、パッチ番号が対応するperim.area.ratios.

非常に大きなグリッドがある場合、これは機能しない可能性があることに注意してください。

于 2012-03-15T13:23:10.900 に答える