使用 mutate 中的 distm 函数计算两点之间的距离
Calculating distance between two points using the distm function inside mutate
我正在尝试计算两组经纬度坐标之间的距离。
我正在使用 geosphere 包中的函数 distm() 来执行此操作。
如果我在 distm() 函数中手动输入值,它工作正常,但我无法让它在我的 mutate 命令中工作。
当 运行 它在 mutate 函数中时,我得到错误:
Error in mutate_impl(.data, dots) :
Evaluation error: Wrong length for a vector, should be 2.
@Dotpi 在评论 "A small note. The method geosphere:distm is not vectorized. To vectorize it use the apply functions." 中回复时写道 ()
由此我猜测这就是导致 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 )
也许我们可以使用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.
我正在尝试计算两组经纬度坐标之间的距离。
我正在使用 geosphere 包中的函数 distm() 来执行此操作。
如果我在 distm() 函数中手动输入值,它工作正常,但我无法让它在我的 mutate 命令中工作。
当 运行 它在 mutate 函数中时,我得到错误:
Error in mutate_impl(.data, dots) :
Evaluation error: Wrong length for a vector, should be 2.
@Dotpi 在评论 "A small note. The method geosphere:distm is not vectorized. To vectorize it use the apply functions." 中回复时写道 (
由此我猜测这就是导致 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 )
也许我们可以使用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.