2012-02-14 95 views
0

我有一個數據幀,包含6列和許多行,其中包含單個標記的魚的位置。的結構是如下所示:基於周圍的行刪除數據框中的行

頭(tag.29912)

Date.and.Time..UTC. Receiver Transmitter Latitude Longitude ndiffs29912 
1 07/10/2010 15:53 VR2W-107619 A69-1303-29912 48.56225 -53.89144   NA 
2 07/10/2010 15:56 VR2W-107619 A69-1303-29912 48.56225 -53.89144   180 
3 07/10/2010 16:00 VR2W-107619 A69-1303-29912 48.56225 -53.89144   240 
4 07/10/2010 16:24 VR2W-107619 A69-1303-29912 48.56225 -53.89144  1440 
5 07/10/2010 16:45 VR2W-104556 A69-1303-29912 48.56460 -53.88956  1260 
6 07/10/2010 16:47 VR2W-107619 A69-1303-29912 48.56225 -53.89144   120 

的ndiffs29912指差在檢測之間的時間 - 因此在第一行具有NA,因爲沒有什麼先前計算的時間與...不同。

我想過濾掉24小時內發生的任何單個檢測(86400秒),因爲這些可能是虛假的。我試過以下代碼嘗試刪除它們:

for (i in 1:length(tag.29912)) { 
if (tag.29912[i,6]>=86400 & tag.29912[i+1,6]>=86400) 
{rm(i)} 

這沒有奏效。我也試過:

for (i in 1:length(tag.29912)) { 
if (tag.29912[i,6]>=86400 & tag.29912[i+1,6]>=86400) 
{new<-tag.29912[i,]} 
else{filteredtag.29912<-as.data.frame(tag.29912[-new])} 
} 

無濟於事。最終,我想要刪除所有單個檢測的新數據幀。 任何提示將非常感謝!

回答

3

幾件事情:

  1. 數據幀是具有一些特殊的要求的列表(即,列表的每個元素必須具有相同的長度)。這樣做的一個結果是length(tag.29912)應該返回列表的長度,即列的數量,而在你的循環中,你可能打算遍歷行數。

  2. 可以使用矢量,這是非常在R.

    學習
  3. rm()從您的工作空間,這是不是你想做什麼刪除對象非常重要拉出所有這些行。

在您的特定情況下,你要在連續86400個值ndiffs29912柱值,以確定行和刪除它們。

因此,像

tag.29912$flag <- FALSE 
for (i in 2:(nrow(tag.29912) - 1){ 
    if (tag.29912[i,6]>=86400 & tag.29912[i+1,6]>=86400){ 
     tag.29912$flag[i] <- tag.29912$flag[i+1] <- TRUE 
    } 
} 
tag.29912 <- tag.29912[!tag.29912$flag,] 

應該給你你想要的東西。

但是,從這段代碼的外觀來看,我強烈建議您花幾個小時仔細花一些時間,爲初學者提供基本的manual

+0

感謝您的快速回復。今天我會研究矢量化。 – user1195564 2012-02-14 11:59:16