计算列表上的距离
Calculating distance over a list
我有两个坐标列表,mapped_coords,unmapped_coords,它们都是坐标列表。
我想取 unmapped_coords 并且对于每个元素 return 在 mapped_coord.
中具有最小距离的点的索引
> head(mapped_coords)
[[1]]
[1] -79.2939 43.8234
[[2]]
[1] -79.7598 43.4381
[[3]]
[1] -79.4569 43.6693
[[4]]
[1] -81.2472 42.9688
[[5]]
[1] -79.1649 43.8073
[[6]]
[1] -79.7388 43.6753
str(mapped_coords)
List of 62815
$ : num [1:2] -79.3 43.8
$ : num [1:2] -79.8 43.4
$ : num [1:2] -79.5 43.7
使用 geosphere 包,我可以使用 distHaversine 来计算一对的距离,但我不确定如何在整个列表中执行此操作。
> distHaversine(unlist(unmapped_coords[1]), unlist(mapped_coords[1]))
[1] 100594.6
您可以将一对坐标和一个坐标矩阵(有 2 列)作为 distHaversine
的输入,这将 return 一个与数字长度相同的距离向量矩阵中的行数。您可以使用 lapply
:
遍历未映射坐标列表
数据:
mapped_coord = list(c(-79.29,43.82),c(-79.76,43.44))
[[1]]
[1] -79.29 43.82
[[2]]
[1] -79.76 43.44
unmapped_coord = list(c(-79.16,43.12),c(-80.52,42.95))
[[1]]
[1] -79.16 43.12
[[2]]
[1] -80.52 42.95
方法:
library(geosphere)
## Transform the list of mapped coordinates into a matrix
mat = do.call(rbind,mapped_coord)
[,1] [,2]
[1,] -79.29 43.82
[2,] -79.76 43.44
## Find the coordinates with the min distances
lapply(unmapped_coord,function(x) which.min(distHaversine(x,mat)))
[[1]]
[1] 2
[[2]]
[1] 2
你可以用geosphere::distm
做一个距离矩阵,你可以用which.min
:
找到其中的最小列(除了对角线,没用)
l <- list(c(-79.2939, 43.8234),
c(-79.7598, 43.4381),
c(-79.4569, 43.6693),
c(-81.2472, 42.9688),
c(-79.1649, 43.8073),
c(-79.7388, 43.6753))
m <- geosphere::distm(do.call(rbind, l))
diag(m) <- NA
apply(m, 1, which.min)
#> [1] 5 6 1 2 1 3
如果您有第二个距离列表,将其作为第二个参数传递给 distm
,使对角线有用。由于不会有NA
s,所以最小列可以用max.col(-m)
.
来计算
我有两个坐标列表,mapped_coords,unmapped_coords,它们都是坐标列表。
我想取 unmapped_coords 并且对于每个元素 return 在 mapped_coord.
中具有最小距离的点的索引> head(mapped_coords)
[[1]]
[1] -79.2939 43.8234
[[2]]
[1] -79.7598 43.4381
[[3]]
[1] -79.4569 43.6693
[[4]]
[1] -81.2472 42.9688
[[5]]
[1] -79.1649 43.8073
[[6]]
[1] -79.7388 43.6753
str(mapped_coords)
List of 62815
$ : num [1:2] -79.3 43.8
$ : num [1:2] -79.8 43.4
$ : num [1:2] -79.5 43.7
使用 geosphere 包,我可以使用 distHaversine 来计算一对的距离,但我不确定如何在整个列表中执行此操作。
> distHaversine(unlist(unmapped_coords[1]), unlist(mapped_coords[1]))
[1] 100594.6
您可以将一对坐标和一个坐标矩阵(有 2 列)作为 distHaversine
的输入,这将 return 一个与数字长度相同的距离向量矩阵中的行数。您可以使用 lapply
:
数据:
mapped_coord = list(c(-79.29,43.82),c(-79.76,43.44))
[[1]]
[1] -79.29 43.82
[[2]]
[1] -79.76 43.44
unmapped_coord = list(c(-79.16,43.12),c(-80.52,42.95))
[[1]]
[1] -79.16 43.12
[[2]]
[1] -80.52 42.95
方法:
library(geosphere)
## Transform the list of mapped coordinates into a matrix
mat = do.call(rbind,mapped_coord)
[,1] [,2]
[1,] -79.29 43.82
[2,] -79.76 43.44
## Find the coordinates with the min distances
lapply(unmapped_coord,function(x) which.min(distHaversine(x,mat)))
[[1]]
[1] 2
[[2]]
[1] 2
你可以用geosphere::distm
做一个距离矩阵,你可以用which.min
:
l <- list(c(-79.2939, 43.8234),
c(-79.7598, 43.4381),
c(-79.4569, 43.6693),
c(-81.2472, 42.9688),
c(-79.1649, 43.8073),
c(-79.7388, 43.6753))
m <- geosphere::distm(do.call(rbind, l))
diag(m) <- NA
apply(m, 1, which.min)
#> [1] 5 6 1 2 1 3
如果您有第二个距离列表,将其作为第二个参数传递给 distm
,使对角线有用。由于不会有NA
s,所以最小列可以用max.col(-m)
.