根据周围的行删除数据框中的行

时间:2012-02-14 02:49:25

标签: r

我有一个包含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])}
}  

无济于事。最终,我想要一个新的数据帧,删除所有单个检测。 任何提示都会非常感激!!

1 个答案:

答案 0 :(得分:3)

有几件事:

  1. 数据框是具有一些特殊要求的列表(即列表的每个元素必须具有相同的长度)。这样做的一个结果是length(tag.29912)应该返回列表的长度,即列数,而在你的循环中你可能想要循环遍历行数。

  2. 您可以使用 vectorization 取出所有这些行,这在R中非常重要。

  3. rm()会从您的工作区中删除对象,而这不是您要执行的操作。

  4. 在您的特定情况下,您希望在ndiffs29912列中标识具有连续86400值的值并删除它们。

    类似

    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给初学者。