【问题标题】:How to transform a nested for-loop operation to a more efficient code in R如何将嵌套的 for 循环操作转换为 R 中更高效的代码
【发布时间】:2019-04-27 04:28:14
【问题描述】:

在 R 编码方面,我是个外行。我正在尝试为其中一项任务运行以下代码。我的基本目的是统计一个特定位置2公里范围内的景点数量,两个景点都由各自的经度和纬度指定。主数据集中的记录数约为 29K,而景点数为 28。如何将以下代码转换为性能更好的 R 代码(目前的代码非常粗糙,根本不是一个好习惯)

for(i in 1:nrow(mainData)) {
  attr_count[i] = 0  
  loc_coord = c(mainData$longitude[i],mainData$latitude[i])
  for(j in 1:nrow(ny_attractions)) {
    attr_coord = c(ny_attractions$lon[j],ny_attractions$lat[j])
    dist = distVincentySphere(attr_coord,loc_coord)
    if(dist <= 2000) {
      attr_count[i] = attr_count[i] + 1
    } 
  }
}

[编辑]:我很抱歉没有早点说清楚。这是我想要实现的一个例子。我有 2 个数据集 -

数据集 - 1(NYC_attractions)(27 条记录)

Dataset-2(房屋列表的主数据)(29K 记录)

现在,我需要在 Dataset-2 中再添加一列 (num_of_attractions),表示指定列表 2Kms 内的景点数量(即 data set-2 中的每条记录)

希望,这可以解释问题

谢谢

【问题讨论】:

  • 您似乎正在尝试操作空间数据。在包sprgeossf 中有很多资源可以做您想做的事情。请给我们一个可重现的例子。
  • 请发布示例数据以供使用。同时发布预期结果应该是什么样子

标签: r for-loop


【解决方案1】:

您好,您的问题已在https://stackoverflow.com/a/49860968/3042154 得到部分解答。当您使用大地坐标(纬度/经度)而不是投影坐标(米)时,可以分步进行。首先使用给定答案使用欧几里得距离粗略选择潜在邻居,然后使用您的距离细化选择

【讨论】:

  • 太棒了!不是部分,这完全回答了我的问题。但是,我仍然需要弄清楚它是否适用于经度和纬度而不是点。非常感谢你的帮助。真的很感激。
  • 很高兴听到这个消息!如果您认为您的问题已回答,请标记它或支持我的回答:-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-13
  • 2022-01-24
  • 2019-11-10
  • 2016-11-28
  • 2014-07-24
相关资源
最近更新 更多