2015-02-17 42 views
0

我正在嘗試計算社交網絡用戶之間的測地距離。假設我有2個用戶U1和U2,我該如何去聲明R中的函數,以便測地距離函數返回由1000個用戶組成的大型數據集中的任意兩個用戶之間的距離。用戶組R中的測地距離函數

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中的函數定義中聲明兩個用戶(經度,緯度)協調員。是否有任何其他方式來做到這一點,以便說如果我有1000個用戶的數據集我可能能夠計算測地線任何2個用戶之間的距離。

回答

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個用戶和距離之間的矩陣:用戶 #號 ñ< - 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) 
+0

謝謝你的回答。它運作良好,但我可以做到沒有規範,是否有任何特定的原因,r規範的平均值爲46和長期爲14。 – Bruno 2015-02-18 18:39:31

+0

我只是作爲一個(隨機)數據發生器使用rnorm。在你的情況下,一個lon矢量將從某個數據庫產生 – bergant 2015-02-18 19:05:44

+0

我已經從一個數據集中讀取了我的lon1,lat1,類似於lon2,lat2從另一個數據集到上面的distm函數。那麼我會讀什麼緯度。我有點困惑,因爲在#位置和cmat矩陣中只有一個經緯度 – Bruno 2015-02-19 00:28:11