R 利用距离余弦计算距离

R 利用距离余弦计算距离,r,dplyr,R,Dplyr,我想计算(lat,lon)坐标对之间的距离,如本例所示: 但是使用dplyr来加速这个过程,并使用来自地球层的distCosine函数 此函数只接受大小为2的向量,我发现唯一可行的方法是: p <- data.frame(lat=runif(6,-90,90), lon=runif(6,-180,180),lat2=runif(6,-90,90), lon2=runif(6,-180,180) ) p$dist <- sapply(1:nrow(p), function(x) di

我想计算(lat,lon)坐标对之间的距离,如本例所示:

但是使用dplyr来加速这个过程,并使用来自地球层的distCosine函数

此函数只接受大小为2的向量,我发现唯一可行的方法是:

p <- data.frame(lat=runif(6,-90,90), lon=runif(6,-180,180),lat2=runif(6,-90,90), lon2=runif(6,-180,180) )
p$dist <- sapply(1:nrow(p), function(x) distCosine(c(p$lon[x], p$lat[x]), c(p$lon2[x], p$lat2[x]) ) )
但错误总是一样的:

Wrong length for a vector, should be 2

知道为什么dplyr不能成功吗?

不知道为什么代码不能工作。使用
do.call
似乎比普通实现或
dplyr
快几个数量级:

library(geosphere)
library(dplyr)

N <- 100
p <- data.frame(lat=runif(N,-90,90), lon=runif(N,-180,180),
                lat2=runif(N,-90,90), lon2=runif(N,-180,180) )

f1 <- function() {
  sapply(1:nrow(p), function(x) distCosine(c(p$lon[x], p$lat[x]),
                                           c(p$lon2[x], p$lat2[x]) ) )
}

pts <- list(p1=p[2:1], p2=p[4:3])
f2 <- function() {
  do.call(distCosine, pts)
}

f3 <- function() {
  p %>% rowwise() %>% mutate(dist2prev = distCosine(c(lon, lat), c(lon2, lat2)))
}

不知道你的代码为什么不工作。使用
do.call
似乎比普通实现或
dplyr
快几个数量级:

library(geosphere)
library(dplyr)

N <- 100
p <- data.frame(lat=runif(N,-90,90), lon=runif(N,-180,180),
                lat2=runif(N,-90,90), lon2=runif(N,-180,180) )

f1 <- function() {
  sapply(1:nrow(p), function(x) distCosine(c(p$lon[x], p$lat[x]),
                                           c(p$lon2[x], p$lat2[x]) ) )
}

pts <- list(p1=p[2:1], p2=p[4:3])
f2 <- function() {
  do.call(distCosine, pts)
}

f3 <- function() {
  p %>% rowwise() %>% mutate(dist2prev = distCosine(c(lon, lat), c(lon2, lat2)))
}

如果我放弃使用distCosine并自行实现该功能,我还可以通过以下方式获得快速响应:

dist <- function(lat1, lon1, lat2, lon2){
  r <- acos(sin(lat1) * sin(lat2) + cos(lat1)*cos(lat2) * cos(abs(lon2-lon1))) * 6378137
}
deg2rad <- function(deg) {(deg * pi) / (180)}

p %>% mutate(x = dist(deg2rad(lat1),deg2rad(lon1),deg2rad(lat2),deg2rad(lon2)))

dist如果我放弃使用distCosine并自己实现该功能,我也会得到快速响应,包括:

dist <- function(lat1, lon1, lat2, lon2){
  r <- acos(sin(lat1) * sin(lat2) + cos(lat1)*cos(lat2) * cos(abs(lon2-lon1))) * 6378137
}
deg2rad <- function(deg) {(deg * pi) / (180)}

p %>% mutate(x = dist(deg2rad(lat1),deg2rad(lon1),deg2rad(lat2),deg2rad(lon2)))

dist对我起作用,这也起作用了:
p%>%突变(dist2prev=distCosine(cbind(lon,lat),cbind(lon2,lat2))
对我起作用了,这也起作用了:
p%>%突变(dist2prev=distCosine(cbind(lon,lat),cbind(lon2,lat2))