パイプ接続されたdplyr関数呼び出しのセットを使用して、単一の単純なフィーチャデータフレーム内でさまざまなユークリッドバッファー(1つは400m、もう1つは800m)を計算しようとしています。バッファ距離は、グループ化変数の値に基づいて、フィーチャごとに指定する必要があります。グループ化変数の既知の値に基づいてデータフレームを簡単に分割できますが、メソッドをできるだけ一般的にしたいと思います。
次のコードは機能しますが、明らかにすべてのグループに対して単一の400mバッファーのみを返します。
library(sf)
library(dplyr)
set.seed(42)
nc <- st_read(system.file("shape/nc.shp", package="sf"))
nc$grp <- sample(c(0,1), replace = TRUE, size = 100)
nc_buff <- nc %>%
group_by(grp) %>%
st_transform(32119) %>%
group_map(~ st_buffer(.x, 400))
理想的には、データフレームを分割し、各バッファーを計算して、両方のバッファーセットを組み合わせた単一の単純なフィーチャデータフレームを返します。
grp == 0の場合は400mのバッファとgrp == 1の場合は800mのバッファを含む単一のデータフレームを返すにはどうすればよいですか?
実際にgroup
データを使用する必要はありませんgroup_map
。実際には、バッファ幅のベクトルを直接st_buffer
:に渡すことができます。
library(sf)
library(dplyr)
set.seed(42)
nc <- st_read(system.file("/shape/nc.shp", package="sf")) %>%
st_transform(32119) %>%
st_centroid() %>%
mutate(grp = sample(c(0,1), 100, replace = TRUE))
ここでは、バッファ幅の列をオンザフライで「作成」します
nc_buff <- nc %>%
st_buffer(., ifelse(.$grp == 0, 4000, 8000))
plot(nc_buff["NAME"])
より複雑なケースや読みやすさの向上については、たとえばifelse
またはcase_when
:を使用して、事前にmutateを使用してバッファー列を作成することもできます。
nc_buff <- nc %>%
mutate(buf_wdt = ifelse(.$grp == 0, 4000, 8000)) %>%
st_buffer(., .$buf_wdt) %>%
select(-buf_wdt)
HTH!
reprexパッケージ(v0.3.0)によって2019-12-27に作成されました
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加