我正在尝试计算社交网络用户之间的测地距离。假设我有2个用户U1和U2,我如何在R中声明该功能,使得测地距离函数返回任意两个用户与包含1000个用户的大数据集之间的距离。
d <- function (U1(lat1,lon1),U2(lat2,lon2))
{
rad <- pi/180
a1 <- lat1 * rad
a2 <- lon1 * rad
b1 <- lat2 * rad
b2 <- lon2 * rad
dlon <- b2 - a2
dlat <- b1 - a1
a <- (sin(dlat/2))^2 + cos(a1) * cos(b1) * (sin(dlon/2))^2
c <- 2 * atan2(sqrt(a), sqrt(1 - a))
R <- 6378.145
d <- R * c
miles <- d*0.621
return(c(d,miles))
}
上述代码不起作用。我不知道如何在R中的函数定义中使用(lat,lon)coordiantes声明两个用户。有没有其他方法可以这样说,如果我有1000个用户的数据集我可能能够计算测地线任何2个用户之间的距离。
答案 0 :(得分:0)
这个图书馆看起来很有希望:
library(geosphere)
distm(c(lon1,lat1), c(lon2,lat2))
有两个矩阵:
distm(
matrix( c(
1, 3,
2, 2,
3, 1
), nrow = 3, ncol = 2),
matrix( c(
4, 6,
5, 5,
6, 4,
3, 1
), nrow = 4, ncol = 2)
)
n个用户的矩阵和它们之间的距离: #用户数量 n < - 100
# positions
lat <- rnorm(n, 46, 1)
lon <- rnorm(n, 14, 1)
#distm also accepts a matrix (2 x n):
cmat <- matrix( c(lat, lon), nrow = n, ncol = 2)
distm(cmat)