计算data.table中两行之间的距离

时间:2015-09-14 19:26:26

标签: r data.table

问题摘要:我正在data.table使用R包(版本1.9.5)清理鱼类遥测数据集(即空间坐标随时间变化) (版本)在Windows 7 PC上。一些数据点是错误的(例如,遥测设备拾取了回声)。我们可以说这些点是错误的,因为鱼比生物可能的距离移动了更远的距离并且作为异常值脱颖而出。实际数据集包含来自30条单独鱼类的超过2,000,000行数据,因此使用data.table包。

我正在移除距离太远的点(即,行进的距离大于最大距离)。但是,我需要重新计算在移除点之后在点之间行进的距离,因为2-3个数据点有时会在群集中被错误记录。目前,我有一个for循环来完成工作,但可能远非最佳状态,我知道我可能遗漏了data.table包中的一些强大工具。

作为技术说明,我的空间尺度足够小,欧几里德距离有效,我的最大距离标准是生物学合理的。

我寻求帮助的地方:我已经查看了SO并找到了几个有用的答案,但没有一个完全符合我的问题。具体而言,所有其他答案仅将一列数据与行之间进行比较。

  1. answer使用data.table比较两行,但只查看一个变量。

  2. answer看起来很有前途,并使用Reduce,但我无法弄清楚如何将Reduce用于两列。

  3. answer使用了来自data.table的索引功能,但我无法弄清楚如何将其与距离函数一起使用。

  4. 最后,此answer演示了roll的{​​{1}}功能。但是,我无法弄清楚如何使用这个函数的两个变量。

  5. 这是我的MVCE:

    data.table

1 个答案:

答案 0 :(得分:4)

我有点困惑为什么你要重新计算距离(并且不必要地复制数据),而不是仅仅进行一次传递:

last = 1
idx = rep(0, nrow(dt))
for (curr in 1:nrow(dt)) {
  if (dist(dt[c(curr, last), .(easting, northing)]) <= maxDist) {
    idx[curr] = curr
    last = curr
  }
}

dt[idx]
#   fish time easting northing
#1:    1    1       1        1
#2:    1    2       2        2
#3:    1    5       3        3
#4:    1    6       4        4