r 空间连接多重标准
r spatial join-multiple criteria
我有两个 sf 数据集,我想找到 10 个最近的邻居,不仅基于距离,还基于对另一列的数学运算。
例如:
a = st_sf(a = 1:3, DD=c("d1","d2","d3"),
geom = st_sfc(st_point(c(1,1)), st_point(c(2,2)), st_point(c(3,3))))
b = st_sf(a = 11:14,DD=c("d1","d2","d2"),
geom = st_sfc(st_point(c(10,10)), st_point(c(2,2)), st_point(c(2,2)), st_point(c(3,3))))
我想在“b”中找到“a”的邻居具有相同的“DD”列值。
目前我正在使用这个 approach 基于 sf
和 nngeo
:
st_join(a, b, join = st_nn, k = 1, progress = FALSE)
但这仅基于几何连接点,我也不知道如何将 DD 考虑在内。
谢谢!
我也在 gis.spatexchange
上发布了这个问题
不确定是否完全理解,但我试一试!因此,请在下面找到一种仅使用 sf
库和一些 base R
函数的可能解决方案。
“策略”是根据DD
列将dataframes
a
和b
转换为dataframes
的列表(参见base R
函数 split()
) 然后,使用函数 sf::st_join()
及其参数 join = st_nearest_feature
为每个 DD
在 dataframe
之间执行连接。最后,最后一个操作是使用base R
函数rbind()
.
将不同连接的结果列表转换为dataframe
Reprex
- 代码
library(sf)
a <- a[a$DD %in% b$DD,] # added following the OP's comment
b <- b[b$DD %in% a$DD,] # added following the OP's comment
a_list <- split(a, a$DD)
b_list <- split(b, b$DD)
result <- do.call(rbind,Map(st_join, a_list, b_list, MoreArgs = list(join = st_nearest_feature)))
- 输出
result
#> Simple feature collection with 3 features and 4 fields
#> Geometry type: POINT
#> Dimension: XY
#> Bounding box: xmin: 1 ymin: 1 xmax: 3 ymax: 3
#> CRS: NA
#> a.x DD.x a.y DD.y geom
#> d1 1 d1 11 d1 POINT (1 1)
#> d2 2 d2 12 d2 POINT (2 2)
#> d3 3 d3 14 d3 POINT (3 3)
数据
注意:我在 b
中添加了 "d3"
a = st_sf(a = 1:3, DD=c("d1","d2","d3"),
geom = st_sfc(st_point(c(1,1)), st_point(c(2,2)), st_point(c(3,3))))
b = st_sf(a = 11:14,
DD=c("d1","d2","d2","d3"),geom = st_sfc(st_point(c(10,10)), st_point(c(2,2)), st_point(c(2,2)), st_point(c(3,3))))
由 reprex package (v2.0.1)
于 2022-02-17 创建
我有两个 sf 数据集,我想找到 10 个最近的邻居,不仅基于距离,还基于对另一列的数学运算。 例如:
a = st_sf(a = 1:3, DD=c("d1","d2","d3"),
geom = st_sfc(st_point(c(1,1)), st_point(c(2,2)), st_point(c(3,3))))
b = st_sf(a = 11:14,DD=c("d1","d2","d2"),
geom = st_sfc(st_point(c(10,10)), st_point(c(2,2)), st_point(c(2,2)), st_point(c(3,3))))
我想在“b”中找到“a”的邻居具有相同的“DD”列值。
目前我正在使用这个 approach 基于 sf
和 nngeo
:
st_join(a, b, join = st_nn, k = 1, progress = FALSE)
但这仅基于几何连接点,我也不知道如何将 DD 考虑在内。
谢谢!
我也在 gis.spatexchange
上发布了这个问题不确定是否完全理解,但我试一试!因此,请在下面找到一种仅使用 sf
库和一些 base R
函数的可能解决方案。
“策略”是根据DD
列将dataframes
a
和b
转换为dataframes
的列表(参见base R
函数 split()
) 然后,使用函数 sf::st_join()
及其参数 join = st_nearest_feature
为每个 DD
在 dataframe
之间执行连接。最后,最后一个操作是使用base R
函数rbind()
.
dataframe
Reprex
- 代码
library(sf)
a <- a[a$DD %in% b$DD,] # added following the OP's comment
b <- b[b$DD %in% a$DD,] # added following the OP's comment
a_list <- split(a, a$DD)
b_list <- split(b, b$DD)
result <- do.call(rbind,Map(st_join, a_list, b_list, MoreArgs = list(join = st_nearest_feature)))
- 输出
result
#> Simple feature collection with 3 features and 4 fields
#> Geometry type: POINT
#> Dimension: XY
#> Bounding box: xmin: 1 ymin: 1 xmax: 3 ymax: 3
#> CRS: NA
#> a.x DD.x a.y DD.y geom
#> d1 1 d1 11 d1 POINT (1 1)
#> d2 2 d2 12 d2 POINT (2 2)
#> d3 3 d3 14 d3 POINT (3 3)
数据
注意:我在
中添加了b
"d3"
a = st_sf(a = 1:3, DD=c("d1","d2","d3"),
geom = st_sfc(st_point(c(1,1)), st_point(c(2,2)), st_point(c(3,3))))
b = st_sf(a = 11:14,
DD=c("d1","d2","d2","d3"),geom = st_sfc(st_point(c(10,10)), st_point(c(2,2)), st_point(c(2,2)), st_point(c(3,3))))
由 reprex package (v2.0.1)
于 2022-02-17 创建