2012-02-14 91 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