2015-07-21 70 views
0

我有兩個數據集,一個包含一組郵政編碼以及他們的「Lat」和「Lon」。我想爲一個數據集中的所有郵編創建一個距離矩陣,其中包含其他數據集的所有郵編。使用imap的郵政編碼距離

df.postcodes <- data.frame(name = c("21075", "20099", "33613"),lat = c(53.459940, 53.5580847,52.0454598),lon = c(9.9288308,10.0119789,8.5196291)) 
df.postcodes1 <- data.frame(name = c("210751", "200991"),lat = c(55.459940, 52.5580847), 
         lon = c(10.9288308,11.0119789)) 

這是樣本數據集,所以基本上我想創建在df.postcodes1所有郵政編碼距離矩陣與df.postcodes所有郵政編碼,然後返回最近的郵政編碼。 我聽說過這個包Imap,但我無法從中創建矩陣。

回答

1

基本上我使用Imapgdist來計算2個點之間的地理距離。

要獲得距離矩陣beteween集合A的中集B點所有的點,你可以使用outer(或expand.gridouter在這裏更好,因爲你想要一個矩陣的結果)。 outer將爲您生成所有索引(2套笛卡爾積)。

最後,您應該矢量化gdist,因爲outer表示向量化函數。我這樣做使用mapply(您可以使用Vectorize)。

library(Imap) 

## a vectorized version of `gdist` 
## x and y are vectors of index 
dist_imap <- 
function(x,y){ 
    p1 <- df.postcodes[x,] 
    p2 <- df.postcodes1[y,] 
    mapply(gdist,p1$lon,p1$lat,p2$lon,p2$lat) 
} 
## Use index of rows since we have to loop over data.frames 
X <- seq_len(nrow(df.postcodes)) 
Y <- seq_len(nrow(df.postcodes1)) 
## outer will generate all comobination of index 
## and pply the vectorized function already created. 
res <- outer(X,Y,dist_imap) 
## naming for pretty output 
rownames(res) <- df.postcodes$name 
colnames(res) <- df.postcodes1$name 

#   210751 200991 
# 21075 125.2018 66.91572 
# 20099 118.7207 70.15158 
# 33613 222.3866 96.82441 
+0

這對我的作品,但是這個代碼失去了列名和行名,可我們也得到到位字段的名字df.postcodes1的和行名稱的郵政編碼df.postcodes郵政編碼,所以它變得清楚哪些郵編給它的距離? – PSraj

+0

@PSraj你可以看到我的編輯。 – agstudy