R 利用距离余弦计算距离
我想计算(lat,lon)坐标对之间的距离,如本例所示: 但是使用dplyr来加速这个过程,并使用来自地球层的distCosine函数 此函数只接受大小为2的向量,我发现唯一可行的方法是: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
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))