r - 使用 purrr::map 在输出中获取多列
问题描述
数据
我有 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
。我想通过根据经度和纬度值查找给定和 asegments
之间的距离来在数据集中创建此列。这意味着我需要将一组经纬度与所有 5 个位置进行比较,并找到距离最短的位置。我认为这可以使用包来完成。 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))
.
解决方案
一种方法是利用匿名函数的灵活性并使用它来返回一个已经符合规范的对象。我使用了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)
宾果游戏“街头”又回到了菜单上!
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
)
推荐阅读
- c++ - 向数组添加索引会导致 C++ 中的数组移位
- ssl - “创建 TLS 客户端凭据时发生致命错误。内部错误状态为 10013。” 每 10 秒
- javascript - 为什么传递给第二个函数的对象(包含一个数组)在我尝试访问它的数组时给出一个空数组?
- python-3.x - 转换为 ArcGIS API geojson 输出和 geopandas 系列/数据框
- deep-linking - 从分支 API 创建的深层链接未打开 App Store
- arm - 如何在 Windows 上使用 Clang/LLVM 交叉编译 STM32L4 cortex-m4 mcu
- javascript - 使用 Google Script 删除重复数据
- python - 如何在这个简单的 FLASK 页面中停止要重置的变量值
- r - How to Repeat some consecutive lines Nth Times in R
- html - CSS 从 * 选择器中排除标签