2016-11-26 114 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"