2016-11-26 58 views
0

我正在玩大型數據集(約1.5m行x 21列)。其中包括交易的長期信息。我計算從幾個目標位置的本次交易的距離和追加以此作爲新列主數據集:讓循環和空間計算更快?

TargetLocation1<-data.frame(Long=XX.XXX,Lat=XX.XXX, Name="TargetLocation1", Size=ZZZZ) 
TargetLocation2<-data.frame(Long=XX.XXX,Lat=XX.XXX, Name="TargetLocation2", Size=YYYY) 

## MainData[6:7] are long and lat columns 

MainData$DistanceFromTarget1<-distVincentyEllipsoid(MainData[6:7], TargetLocation1[1:2]) 
MainData$DistanceFromTarget2<-distVincentyEllipsoid(MainData[6:7], TargetLocation2[1:2]) 

我使用geosphere()包的distVincentyEllipsoid函數來計算的距離。正如你可以成像,distVincentyEllipsoid功能是一個計算密集型,但它更準確(與同一包的其他功能distHaversine(); distMeeus(); distRhumb(); distVincentySphere()

Q1)我需要約5-10分鐘來計算每個目標位置的距離[我有16 GB RAM和i7 6600U 2.81Ghz Intel CPU],並且我有多個目標位置。有沒有更快的方法來做到這一點? Q2)然後,我爲分類變量創建一個新列,以標記每個交易是否屬於目標位置的市場定義。帶2個if語句的for循環。有沒有其他方法可以使計算速度更快?如果你失去了循環

MainData$TransactionOrigin<-"Other" 

    for (x in 1:nrow(MainData)){ 
    if (MainData$DistanceFromTarget1[x]<=7000) 
    MainData$TransactionOrigin[x]="Target1" 
    if (MainData$DistanceFromTarget2[x]<=4000) 
    MainData$TransactionOrigin[x]="Target2" 
} 

感謝

+0

這是一個令人着迷的問題。我有兩個問題。 (1)你有任何近對立點? Vincenty公式的收斂速度非常緩慢,幾乎是相反的。 (2)你需要額外的準確性嗎?你真的使用距離,還是隻使用分類?如果是後者,你實際上不可能有很多(或者實際上是)任何通過使用更快算法而改變的分類值。 – JWLM

回答

0

關於Q2
這將很大跑得更快。

MainData$TransactionOrigin <- "Other" 
    MainData$TransactionOrigin[which(MainData$DistanceFromTarget1[x]<=7000)] <- "Target1" 
    MainData$TransactionOrigin[which(MainData$DistanceFromTarget2[x]<=4000)] <- "Target2"