使循环和空间计算更快?

时间:2016-11-26 02:08:08

标签: r performance geospatial large-data

我正在玩大型数据集(约1.5米行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"
}

由于

1 个答案:

答案 0 :(得分:0)

关于Q2 如果丢失循环,这将运行得更快。

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