【问题标题】:Make For Loop and Spacial Computing Faster?让循环和空间计算更快?
【发布时间】:2017-04-10 09:40:15
【问题描述】:

我正在使用一个大型数据集(约 150 万行 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) 有近对跖点吗? Vincenty 的公式对于近对跖点收敛非常缓慢。 (2) 你需要额外的精度吗?你真的使用距离,还是只使用分类?如果是后者,您实际上不太可能拥有许多(或者实际上是任何)分类值,这些值可以通过使用更快的算法进行更改。

标签: r performance geospatial large-data


【解决方案1】:

关于第二季度
如果你失去循环,这将运行得更快。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-28
    • 2020-05-11
    • 1970-01-01
    • 2020-07-24
    • 1970-01-01
    • 2021-07-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多