我有2个数据集:
* segments
数据集代表路段(lhrs
。)
* hwys
数据集表示包含单个lhrs
的高速公路。
> segments
# A tibble: 1 x 5
lhrs mto_collision_ref_number latitude longitude highway_number
<dbl> <dbl> <dbl> <dbl> <dbl>
1 10004 1549630 42.9 -78.9 1
> hwys
# A tibble: 5 x 3
STREET longitude latitude
<fct> <dbl> <dbl>
1 HIGHWAY 3 -80.0 42.9
2 ADELAIDE AVE E -78.9 43.9
3 HOWARD AVE -83.0 42.2
4 HIGHWAY 12 -79.7 44.7
5 CORONATION BLVD -80.3 43.4
如您所见,STREET
数据集中缺少segments
列。我想通过基于经度和纬度值找到给定的segments
和lhrs
之间的距离,在STREET
数据集中创建此列。这意味着我需要将lhrs
的一组长经纬度与所有五个STREET
位置进行比较,并找到距离最小的位置。我认为可以使用purrr
包来完成。
我可以使用lhrs
的距离找到每个STREET
和geosphere::distVincentyEllipsoid()
之间的距离,如下所示:
library(tidyverse)
segments_nested <- segments %>% group_by(mto_collision_ref_number) %>% nest()
segments_nested %>%
mutate(diztances = purrr::map(
data, ~ distVincentyEllipsoid(hwys %>% select(longitude, latitude),
c(.$longitude, .$latitude)))) %>%
unnest(.preserve = data)
# A tibble: 5 x 3
mto_collision_ref_number data diztances
<dbl> <list> <dbl>
1 1549630 <tibble [1 x 4]> 85316.
2 1549630 <tibble [1 x 4]> 110700.
3 1549630 <tibble [1 x 4]> 342921.
4 1549630 <tibble [1 x 4]> 213961.
5 1549630 <tibble [1 x 4]> 125547.
但是,我仍然不知道如何将这些距离与STREET
连接起来。请指导我如何使用purrr::map
计算距离以及相应的STREET
。一旦有了,我就可以group_by(mto_collision_ref_number)
并获得summarize(min(diztances))
。
答案 0 :(得分:1)
回家的一种方法是利用匿名函数的灵活性,并使用它返回已经符合规范的对象。我使用了group_by()
和transmute()
的组合。
# this is setup for transmute() so we keep 'STREET' around
hwys <- group_by(hwys, STREET)
segments_nested %>%
mutate(results = purrr::map(
data, ~ transmute(hwys, diztances = geosphere::distVincentyEllipsoid(c(longitude, latitude),
c(.$longitude, .$latitude))))) %>%
unnest(results)
还有宾果游戏'STREET' is back on the menu boys!
mto_collision_ref_number STREET diztances
<int> <chr> <dbl>
1 1549630 HIGHWAY3 89840.
2 1549630 ADELAIDEAVEE 111101.
3 1549630 HOWARDAVE 345569.
4 1549630 HIGHWAY12 210099.
5 1549630 CORONATIONBLVD 126702.
将来,尝试以更容易重现的格式共享数据,我更喜欢read.table(text = )
,但如上所述,dput()
也很好。我必须复制,粘贴和操作您的输出块才能将其放入R:
segments <- read.table(
text = "lhrs mto_collision_ref_number latitude longitude highway_number
1 10004 1549630 42.9 -78.9 1",
header = T,
stringsAsFactors = F
)
hwys <- read.table(
text = " STREET longitude latitude
1 HIGHWAY3 -80.0 42.9
2 ADELAIDEAVEE -78.9 43.9
3 HOWARDAVE -83.0 42.2
4 HIGHWAY12 -79.7 44.7
5 CORONATIONBLVD -80.3 43.4",
header = T,
stringsAsFactors = F
)