2015-09-14 156 views
5

總結:我清理魚遙測數據集(即,通過時間空間座標)使用data.table包在R(版本)(1.9.5版本)在Windows 7電腦上。一些數據點是錯誤的(例如,遙測設備回波)。我們可以說這些觀點是錯誤的,因爲魚的移動距離遠遠超過生物學可能並且脫穎而出。實際數據集包含來自30條魚的超過2,000,000行數據,因此使用data.table包。計算兩個行之間的距離在問題data.table

我刪除的距離太遠(即行進距離大於最大距離)的點。但是,我需要重新計算刪除點後移動的點之間的距離,因爲有時會在羣中錯誤地記錄2-3個數據點。目前,我有一個可以完成工作的for循環,但可能遠沒有達到最佳效果,而且我知道我可能會缺少data.table軟件包中的一些強大工具。

作爲技術說明,我的空間尺度足夠小,以至於歐幾里得距離可以工作,並且我的最大距離標準是生物學合理的。

我在哪裏尋找幫助:我查看過所以發現了幾個有用的答案,但沒有一個完全符合我的問題。具體而言,所有其他答案僅將一列數據與行之間進行比較。

  1. answer比較了使用data.table兩行,但只能看一個變量。

  2. answer看起來很有前途,並使用Reduce,但我不知道如何使用Reduce兩欄。

  3. answer使用從data.table索引功能,但我不知道如何使用它與距離函數。

  4. 最後,這個answer演示data.tableroll函數。但是,我無法弄清楚如何在這個函數中使用兩個變量。

這裏是我的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)]))] 
    } 
} 

回答

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 
+0

我正在傳遞兩次數據並複製,因爲我找不到一個單一的解決方案:)。謝謝您的回答! –

+1

哈哈,很高興幫助 – eddi

相關問題