總結:我清理魚遙測數據集(即,通過時間空間座標)使用data.table
包在R
(版本)(1.9.5版本)在Windows 7電腦上。一些數據點是錯誤的(例如,遙測設備回波)。我們可以說這些觀點是錯誤的,因爲魚的移動距離遠遠超過生物學可能並且脫穎而出。實際數據集包含來自30條魚的超過2,000,000行數據,因此使用data.table
包。計算兩個行之間的距離在問題data.table
我刪除的距離太遠(即行進距離大於最大距離)的點。但是,我需要重新計算刪除點後移動的點之間的距離,因爲有時會在羣中錯誤地記錄2-3個數據點。目前,我有一個可以完成工作的for
循環,但可能遠沒有達到最佳效果,而且我知道我可能會缺少data.table
軟件包中的一些強大工具。
作爲技術說明,我的空間尺度足夠小,以至於歐幾里得距離可以工作,並且我的最大距離標準是生物學合理的。
我在哪裏尋找幫助:我查看過所以發現了幾個有用的答案,但沒有一個完全符合我的問題。具體而言,所有其他答案僅將一列數據與行之間進行比較。
這answer比較了使用
data.table
兩行,但只能看一個變量。這answer看起來很有前途,並使用
Reduce
,但我不知道如何使用Reduce
兩欄。這answer使用從
data.table
索引功能,但我不知道如何使用它與距離函數。最後,這個answer演示
data.table
的roll
函數。但是,我無法弄清楚如何在這個函數中使用兩個變量。
這裏是我的MVCE:
library(data.table)
## Create dummy data.table
dt <- data.table(fish = 1,
time = 1:6,
easting = c(1, 2, 10, 11, 3, 4),
northing = c(1, 2, 10, 11, 3, 4))
dt[ , dist := 0]
maxDist = 5
## First pass of calculating distances
for(index in 2:dim(dt)[1]){
dt[ index,
dist := as.numeric(dist(dt[c(index -1, index),
list(easting, northing)]))]
}
## Loop through and remove points until all of the outliers have been
## removed for the data.table.
while(all(dt[ , dist < maxDist]) == FALSE){
dt <- copy(dt[ - dt[ , min(which(dist > maxDist))], ])
## Loops through and recalculates distance after removing outlier
for(index in 2:dim(dt)[1]){
dt[ index,
dist := as.numeric(dist(dt[c(index -1, index),
list(easting, northing)]))]
}
}
我正在傳遞兩次數據並複製,因爲我找不到一個單一的解決方案:)。謝謝您的回答! –
哈哈,很高興幫助 – eddi