我有一个包含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])}
}
无济于事。最终,我想要一个新的数据帧,删除所有单个检测。 任何提示都会非常感激!!
答案 0 :(得分:3)
有几件事:
数据框是具有一些特殊要求的列表(即列表的每个元素必须具有相同的长度)。这样做的一个结果是length(tag.29912)
应该返回列表的长度,即列数,而在你的循环中你可能想要循环遍历行数。
您可以使用 vectorization 取出所有这些行,这在R中非常重要。
rm()
会从您的工作区中删除对象,而这不是您要执行的操作。
在您的特定情况下,您希望在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给初学者。