r - 多个点之间的最近点
问题描述
我有两个列表,一个包含一个id
,每个id
包含一组坐标:
+-------+------+------+
| store | lat | lon |
+-------+------+------+
| 123 | 37.2 | 13.5 |
| 456 | 39.1 | 9.1 |
| 789 | 45.4 | 11.0 |
+-------+------+------+
第二个是带有坐标和其他数据的气象站列表:
+----+--------+--------+---------------+----------------+
| id | lat | lon | name | address |
+----+--------+--------+---------------+----------------+
| 1 | 44.907 | 8.612 | airport_one | bond street |
| 2 | 39.930 | 9.720 | airport_two | oxford street |
| 3 | 40.020 | 15.280 | airport_three | ellesmere road |
+----+--------+--------+---------------+----------------+
我想在第一个列表(商店列表)中添加两列距离和最近机场的名称,所以我需要将每个商店与每个机场进行比较并返回最短距离。
我试图在 for 循环中使用distm
函数来实现这一点,但我肯定会失去一些东西:
for (val in 1:length(airport_master[,1])){
n <- distm(store_master[1,3:2], airport_master[val,6:5])
distances <- append(distances, n)
store_master$closest_airport <- airport_master$name[val])
}
有没有图书馆或更好的方法来实现这个结果?
解决方案
您可以使用tidyverse
包执行以下操作:
library(tidyverse)
# data
store_master <-
tibble(
'store' = c(123, 456, 789),
'lat' = c(37.2, 39.1, 45.4),
'lon' = c(13.5, 9.1, 11.0)
)
airport_master <-
tibble(
'id' = 1:3,
'lat' = c(44.907, 39.93, 40),
'lon' = c(8.612, 9.72, 15.28),
'name' = c('airport_one', 'airport_two', 'airport_three')
)
# solution
crossing(
store = store_master$store,
id = airport_master$id
) %>%
left_join(store_master, "store") %>%
left_join(airport_master, "id", suffix = c("_store", "_airpot")) %>%
mutate(distance = sqrt((lat_store - lat_airpot)^2 + (lon_store - lon_airpot)^2)) %>%
group_by(store) %>%
filter(distance == min(distance))
结果:
store id lat_store lon_store lat_airpot lon_airpot name distance
<dbl> <int> <dbl> <dbl> <dbl> <dbl> <chr> <dbl>
1 123 3 37.2 13.5 40 15.3 airport_three 3.32
2 456 2 39.1 9.1 39.9 9.72 airport_two 1.04
3 789 1 45.4 11 44.9 8.61 airport_one 2.44
推荐阅读
- c - 如何访问c中字符串的最后n个元素?
- .net - dotnet 发布错误在标准错误中不可用
- python - 如何在 Celery 中将值从第一个任务发送到第三个任务?
- node.js - Safari 在下载 .pkpass 时抛出错误
- python - 如何从公共/共享文件夹中导入特定的包?
- image - Expo 图像选择器 uri 不适用于每部手机
- python - 跟踪 numpy 数组的索引变化
- redux - 未经检查的 runtime.lastError:消息端口在收到响应之前关闭。使用 redux 时
- javascript - 如何调整源映射以直接在受影响的文件中而不是在块中显示控制台?
- react-native - expo-payments-stripe 中的 setOptionsAsync 应该将什么传递给 androidPayMode?