问题摘要:我正在data.table
使用R
包(版本1.9.5)清理鱼类遥测数据集(即空间坐标随时间变化) (版本)在Windows 7 PC上。一些数据点是错误的(例如,遥测设备拾取了回声)。我们可以说这些点是错误的,因为鱼比生物可能的距离移动了更远的距离并且作为异常值脱颖而出。实际数据集包含来自30条单独鱼类的超过2,000,000行数据,因此使用data.table
包。
我正在移除距离太远的点(即,行进的距离大于最大距离)。但是,我需要重新计算在移除点之后在点之间行进的距离,因为2-3个数据点有时会在群集中被错误记录。目前,我有一个for
循环来完成工作,但可能远非最佳状态,我知道我可能遗漏了data.table
包中的一些强大工具。
作为技术说明,我的空间尺度足够小,欧几里德距离有效,我的最大距离标准是生物学合理的。
我寻求帮助的地方:我已经查看了SO并找到了几个有用的答案,但没有一个完全符合我的问题。具体而言,所有其他答案仅将一列数据与行之间进行比较。
答案 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