用 R 计算距边界的距离
Calculate distance from a border with R
我需要计算一组城市的边界与米纳斯吉拉斯州其他城市之间的距离。这个想法是进行回归不连续设计(RRD),边界是我的切断。
这里是一个数据库的例子:
code latitude longitude munic cerrado mantiqueira mata
<dbl> <chr> <dbl> <chr> <dbl> <dbl> <dbl>
1 3170057 -196351 -421059 Ubaporanga 0 0 1
2 3170107 -197472 -479381 Uberaba 1 0 0
3 3170206 -189141 -482749 Uberlândia 1 0 0
4 3170404 -163592 -469022 Unaí 1 0 0
5 3170503 -203521 -42737 Urucânia 0 0 0
6 3170529 -161244 -457352 Urucuia 0 0 0
7 3170602 -203333 -463688 Vargem Bonita 0 0 0
8 3170651 -153987 -423085 Vargem Grande do Ri~ 0 0 0
9 3170701 -215556 -454364 Varginha 0 0 0
10 3170750 -183741 -460313 Varjão de Minas 1 0 0
11 3170800 -175944 -447226 Várzea da Palma 0 0 0
12 3171030 -155845 -436121 Verdelândia 0 0 0
13 3171071 -173974 -427307 Veredinha 0 0 0
14 3171154 -200406 -422688 Vermelho Novo 0 0 1
15 3171303 -207559 -428742 Viçosa 0 0 1
16 3171402 -20867 -422401 Vieiras 0 0 1
17 3171709 -223264 -450965 Virgínia 0 0 0
18 3171808 -188154 -427015 Virginópolis 0 0 0
19 3171907 -184738 -423067 Virgolândia 0 0 0
20 3172004 -210127 -428361 Visconde do Rio Bra~ 0 0 0
您可以下载完整的数据库here。
“cerrado”、“mantiqueira”和“mata”是米纳斯吉拉斯州的地区。 1 表示自治市在区域内。我还有每个城市的经纬度数据。思路是:
1 - 为每组区域创建边界。
2 - 找到一种方法来计算组内和组外的城市与边界的距离。
这是我想到的策略示例:
在空间分析方面,包 geobr
在巴西非常流行。但是,我找不到一种方法来进行我想要的分析。
您的 NA 值太多,无法进行真正的不连续设计,如上所示。
Map.
因此,最好的办法可能是按类别计算最近的邻居:
library(tidyverse)
teste <-
readxl::read_xlsx("teste.xlsx") %>%
rename(name_muni = munic,
code_muni = code) %>%
mutate(latitude = as.numeric(latitude),
longitude = as.numeric(longitude))
cerrado <- filter(teste, cerrado == 1)
other <- filter(teste, cerrado != 1)
nn <- FNN::get.knnx(select(other, longitude, latitude), select(cerrado, longitude, latitude), k = 1)
cerrado <- mutate(cerrado, dist_other = nn$nn.dist[, 1])
现在对于每个 cerrado 自治市,您都有它到另一个地区的距离;您可以对其他人重复此操作,如果您想将它们拉回到一个数据框中,请使用 rbind
。
我需要计算一组城市的边界与米纳斯吉拉斯州其他城市之间的距离。这个想法是进行回归不连续设计(RRD),边界是我的切断。
这里是一个数据库的例子:
code latitude longitude munic cerrado mantiqueira mata
<dbl> <chr> <dbl> <chr> <dbl> <dbl> <dbl>
1 3170057 -196351 -421059 Ubaporanga 0 0 1
2 3170107 -197472 -479381 Uberaba 1 0 0
3 3170206 -189141 -482749 Uberlândia 1 0 0
4 3170404 -163592 -469022 Unaí 1 0 0
5 3170503 -203521 -42737 Urucânia 0 0 0
6 3170529 -161244 -457352 Urucuia 0 0 0
7 3170602 -203333 -463688 Vargem Bonita 0 0 0
8 3170651 -153987 -423085 Vargem Grande do Ri~ 0 0 0
9 3170701 -215556 -454364 Varginha 0 0 0
10 3170750 -183741 -460313 Varjão de Minas 1 0 0
11 3170800 -175944 -447226 Várzea da Palma 0 0 0
12 3171030 -155845 -436121 Verdelândia 0 0 0
13 3171071 -173974 -427307 Veredinha 0 0 0
14 3171154 -200406 -422688 Vermelho Novo 0 0 1
15 3171303 -207559 -428742 Viçosa 0 0 1
16 3171402 -20867 -422401 Vieiras 0 0 1
17 3171709 -223264 -450965 Virgínia 0 0 0
18 3171808 -188154 -427015 Virginópolis 0 0 0
19 3171907 -184738 -423067 Virgolândia 0 0 0
20 3172004 -210127 -428361 Visconde do Rio Bra~ 0 0 0
您可以下载完整的数据库here。
“cerrado”、“mantiqueira”和“mata”是米纳斯吉拉斯州的地区。 1 表示自治市在区域内。我还有每个城市的经纬度数据。思路是:
1 - 为每组区域创建边界。
2 - 找到一种方法来计算组内和组外的城市与边界的距离。
这是我想到的策略示例:
在空间分析方面,包 geobr
在巴西非常流行。但是,我找不到一种方法来进行我想要的分析。
您的 NA 值太多,无法进行真正的不连续设计,如上所示。
Map.
因此,最好的办法可能是按类别计算最近的邻居:
library(tidyverse)
teste <-
readxl::read_xlsx("teste.xlsx") %>%
rename(name_muni = munic,
code_muni = code) %>%
mutate(latitude = as.numeric(latitude),
longitude = as.numeric(longitude))
cerrado <- filter(teste, cerrado == 1)
other <- filter(teste, cerrado != 1)
nn <- FNN::get.knnx(select(other, longitude, latitude), select(cerrado, longitude, latitude), k = 1)
cerrado <- mutate(cerrado, dist_other = nn$nn.dist[, 1])
现在对于每个 cerrado 自治市,您都有它到另一个地区的距离;您可以对其他人重复此操作,如果您想将它们拉回到一个数据框中,请使用 rbind
。