2015-04-03 69 views
4

對不起,這將是一個for循環101問題。我很努力寫一個簡單的for循環來生成基於經緯度數據在空間數據上使用一個簡單的循環

locations <-read.csv("distances.csv") 

地區城市之間距離的表返回如下表:

 City Type  long  lat 
1 Sheffield EUR -1.470085 53.38113 
2  HK WRLD 114.109497 22.39643 
3 Venice EUR 12.315515 45.44085 
4 New York WRLD -74.005941 40.71278 

我在這個特殊的部分目標其任務是生成一個關聯矩陣性質中每個城市之間的距離(以公里爲單位)的表格,其中對角線爲0(即所有城市距離它們自己的距離爲零)。

要做到這一點,我使用的SP包,這需要長期的緯度值的矩陣,這樣我就可以按以下方式刪除文本:

datmax <- data.matrix(locations) 
datmax2 <- datmax[,-1:-2] 

工具spDistsN1讓我通過獲取這些信息比較矩陣中所有城市的距離來自一個城市。很顯然,我可以使用下面的表達式從謝菲爾德(市,行#1)取得所有城市的距離:

km <- spDistsN1(datmax2, datmax2[1,], longlat=TRUE) 

這種正確得出:

[1] 0.000 9591.009 1329.882 5436.133 

然而,爲了實現我想要的相關性矩陣式的輸出,我想要實現這個每個城市的,所以我試着寫一個for循環:

for (i in 1:nrow(datmax2)){ 
    kmnew <- spDistsN1(datmax2, datmax2[i,], longlat=TRUE) 
} 

這讓我對紐約的正確值:

[1] 5436.133 12967.023 6697.541  0.000 

所以我認爲我在整個循環中用另一個城市覆蓋了一個城市。我很感謝幫助我向我展示我錯在哪裏。非常感謝。

回答

4

首先聲明一個矩陣,並使用你的迭代i,表示該行中填寫:

kmnew <- matrix(NA, nrow=4, ncol=4) 
for (i in 1:nrow(datmax2)){ 
    kmnew[i,] <- spDistsN1(datmax2, datmax2[i,], longlat=TRUE) 
} 

colnames(kmnew) <- locations$City 
rownames(kmnew) <- locations$City 

結果

> kmnew 

      Sheffield  HK Venice New York 
Sheffield  0.000 9591.009 1329.882 5436.134 
HK   9591.009  0.000 9134.698 12967.024 
Venice  1329.882 9134.698 0.000 6697.541 
New York 5436.134 12967.024 6697.541  0.000 
2

我不知道如果這是你在找什麼爲

library(sp) 

# Provide data for reproducibility 
locations <- data.frame(City=c("Sheffield", "HK", "Venice", "New York"), 
        Type=c("EUR", "WRLD", "EUR", "WRLD"), 
        long=c(-1.470085, 114.109497, 12.315515, -74.005941), 
        lat=c(53.38113, 22.39643, 45.44085, 40.71278)) 

km <- apply(as.matrix(locations[, c(-1, -2)]), 1, function(x){ 
    spDistsN1(as.matrix(locations[, c(-1, -2)]), x, longlat=TRUE) 
}) 

km <- data.frame(locations[, 1], km) 
names(km) <- c("City", as.character(locations[, 1])) 
km 

個結果

 City Sheffield  HK Venice New York 
1 Sheffield  0.000 9591.009 1329.882 5436.134 
2  HK 9591.009  0.000 9134.698 12967.024 
3 Venice 1329.882 9134.698 0.000 6697.541 
4 New York 5436.134 12967.024 6697.541  0.000 
+0

這裏的所有答案真的很有幫助。基於我現有的思維過程,Dominic對我來說是最容易掌握的。 'apply'是一個優雅的解決方案,感謝Dimitris和Nicola,我會檢查這個包,儘管從我的嘗試中可以看出,超越2D思維可能需要一些時間! – RichS 2015-04-03 11:14:04

1

您可以從geosphere包試試distm功能:

distm(datmax2) 
#  [,1]  [,2] [,3]  [,4] 
#[1,]  0 9586671 1329405 5427956 
#[2,] 9586671  0 9130036 12962132 
#[3,] 1329405 9130036  0 6687416 
#[4,] 5427956 12962132 6687416  0 

它返回的距離以米爲單位,並考慮到地球的幾何形狀。

+0

是的,但它假定地球是一個球體; sp :: spDistsN1假定它是一個橢球體(WGS84)。 – 2015-04-03 16:24:13