【问题标题】:Calculating distance between two points using the distm function inside mutate使用 mutate 中的 distm 函数计算两点之间的距离
【发布时间】:2018-11-14 15:00:12
【问题描述】:

我正在尝试计算两组经纬度坐标之间的距离。

我正在使用 geosphere 包中的函数 distm() 来执行此操作。

如果我在 distm() 函数中手动输入值,它可以正常工作,但我无法让它在我的 mutate 命令中工作。

在 mutate 函数中运行它时出现错误:

Error in mutate_impl(.data, dots) : 
Evaluation error: Wrong length for a vector, should be 2.

@Dotpi 在评论中写道“一个小注释。geosphere:distm 方法未矢量化。要对其进行矢量化,请使用 apply 函数。” 当他在此线程中回复时 (Function to calculate geospatial distance between two points (lat,long) using R)

据此,我猜测这是导致 mutate 函数错误的原因,但我不知道如何解决它。我更喜欢 tidyverse 解决方案,但我们不胜感激。

下面是一个测试数据框,首先是产生错误的代码,然后是一个工作示例,我在 DF 中手动插入第一行的值。

library(tidyverse)
library(geosphere)

set.seed(1)
DF <- tibble(
  Long1 = sample(1:10),
  Lat1 = sample(1:10),
  Long2 = sample(1:10),
  Lat2 = sample(1:10))

DF %>% mutate(
  Dist = distm(x= c(Long1, Lat1), y=c(Long2, Lat2), fun = distHaversine ))

distm( x = c(3, 3), y = c(10, 5), fun = distHaversine )

【问题讨论】:

    标签: r dplyr geosphere


    【解决方案1】:

    也许我们可以使用pmap

    library(purrr)
    pmap_dbl(DF, ~ distm(x = c(..1, ..2), y = c(..3, ..4), 
                        fun = distHaversine) %>% c)
    

    mutate结合时

    library(dplyr)
    DF %>% 
      mutate(Dist = pmap_dbl(., ~
               distm(x = c(..1, ..2), y = c(..3, ..4), fun = distHaversine)))
    # A tibble: 10 x 5
    #   Long1  Lat1 Long2  Lat2     Dist
    #   <int> <int> <int> <int>    <dbl>
    # 1     3     3    10     5  808552.
    # 2     4     2     2     6  497573.
    # 3     5     6     6     4  248726.
    # 4     7    10     1     2 1110668.
    # 5     2     5     9    10  951974.
    # 6     8     7     8     8  111319.
    # 7     9     8     7     9  246730.
    # 8     6     4     5     1  351986.
    # 9    10     1     3     7 1024599.
    #10     1     9     4     3  745867.
    

    【讨论】:

    • 非常感谢。这行得通。现在一定是学习咕噜的时候了DF %&gt;% mutate( Dist = pmap_dbl(DF, ~ distm(x = c(..1, ..2), y = c(..3, ..4), fun = distHaversine) %&gt;% c))
    • 请问%&gt;% c 是做什么的?没有它,代码就可以正常工作,我无法使用 ?pmap_dbl() 找到有关该选项的任何信息
    • @SteenHarsted 我添加的原因是输出是一个具有单列/行的矩阵。矩阵也是具有暗淡属性的向量。假设您不使用map_dbl 而是使用map,这将很清楚。为了将其强制为向量,我使用了c。无论如何,map_dbl 会强制执行
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-16
    • 2010-10-30
    • 2018-09-26
    • 1970-01-01
    • 2011-04-23
    相关资源
    最近更新 更多