[英]Calculating the distance between two latitude and longitude Geocordinate in a R dataframe
我想计算 dataframe 中两个经纬度位置之间的距离
df <- tibble("lat1"=c(0,1,2),"lon1"=c(0,1,2),"lat2"=c(90,91,92),"lon2"=c(90,91,92))
df %>%
dplyr::mutate(distance_trip=mapply(FUN = distHaversine,c(lat1, lon1),c(lat2, lon2)))
我得到的错误是:
错误: mutate()
列distance_trip
有问题。 ℹ distance_trip = mapply(FUN = distHaversine, c(lat1, lon1), c(lat2, lon2))
。 x 向量的长度错误,应为 2 运行rlang::last_error()
以查看错误发生的位置。
不知道为什么我无法将 function 应用于数据框。
这里发生了一些事情:
geosphere::distHaversine
是矢量化的,(矩阵化?),所以如果我们给它matrix
输入,我们不需要使用mapply
一次一行地做。 这会快得多。
c()
只是把东西粘在一起。 c(lat1, lon1)
将是0, 1, 2, 0, 1, 2
一个接一个。 我们需要cbind
来制作一个矩阵。 (我知道您使用mapply
的目的,但是长c(lat1, lon1)
向量是您传递给mapply
的内容,相反,您需要分别传递lat1
和lon1
以及c()
各个项目在FUN
内部......但matrix
方法会更好。)
尽管“lat, lon”是口语用法,但几乎所有函数都需要“lon, lat”,因为经度更像“x”,纬度更像“y”,并且(x, y)
范式成立。
最大纬度为 90,但您的lat2
有值 91 和 92,如果不解决会导致错误。
修复所有这些,我们可以使用:
df <- tibble(
"lat1"=c(0,1,2),
"lon1"=c(0,1,2),
"lat2"=4:6, ## valid latitudes
"lon2"=c(90,91,92)
)
library(dplyr)
library(geosphere)
df %>%
mutate(distance_trip = geosphere::distHaversine(
cbind(lon1, lat1), cbind(lon2, lat2)
))
# # A tibble: 3 × 5
# lat1 lon1 lat2 lon2 distance_trip
# <dbl> <dbl> <int> <dbl> <dbl>
# 1 0 0 4 90 10018754.
# 2 1 1 5 91 10009053.
# 3 2 2 6 92 9995487.
这是使它与mapply
工作的方法——写起来有点尴尬,而且也会更慢:(
df <- tibble(
"lat1"=c(0,1,2),
"lon1"=c(0,1,2),
"lat2"=4:6, ## valid latitudes
"lon2"=c(90,91,92)
)
df %>%
mutate(distance_trip = mapply(
FUN = function(x1, y1, x2, y2) {
distHaversine(c(x1, y1), c(x2, y2))
},
x1 = lon1, y1 = lat1, x2 = lon2, y2 = lat2
))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.