【问题标题】:Using purrr::map to get multiple columns in the output使用 purrr::map 在输出中获取多列
【发布时间】:2019-03-19 17:21:10
【问题描述】:

数据

我有 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

问题

如您所见,segments 数据集中缺少 STREET 列。我想通过根据经度和纬度值查找给定lhrsSTREET 之间的距离,在segments 数据集中创建此列。这意味着我需要将一组经纬度 lhrs 与所有 5 个 STREET 位置进行比较,并找到距离最短的位置。我认为这可以使用purrr 包来完成。

我的代码

我可以使用geosphere::distVincentyEllipsoid() 距离找到每个lhrsSTREET 之间的距离,如下所示:

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))

【问题讨论】:

  • 使用dput发布数据会更容易提供帮助
  • 将您的最后一组代码导入另一个不带参数调用的unnest() 中,得到一个包含引用、距离以及构成data 内容的列的数据框。最终尺寸为 5x6
  • @camille 这不包括STREET

标签: r purrr


【解决方案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
)

【讨论】:

  • 非常感谢! +1 为 gif :) 我不知道为什么,但是这些数据的 dput 的输出太长了。这可能是由于空间几何信息。在数据中。
猜你喜欢
  • 2019-05-17
  • 1970-01-01
  • 2021-01-25
  • 2018-04-05
  • 1970-01-01
  • 2021-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多