удаление строк в кадре данных на основе окружающих строк - PullRequest
0 голосов
/ 14 февраля 2012

У меня есть фрейм данных с 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 Ответ

3 голосов
/ 14 февраля 2012

Пара вещей:

  1. Фрейм данных - это список с некоторыми особыми требованиями (т.е. каждый элемент списка должен иметь одинаковую длину).Одним из следствий этого является то, что length(tag.29912) должен возвращать длину списка, то есть количество столбцов, тогда как в вашем цикле вы, вероятно, намеревались выполнить цикл по количеству строк.

  2. Вы можете вытащить все эти строки, используя векторизацию , что очень важно выучить в R.

  3. 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,]  

должно дать вам то, что вы хотите.

Но, судя по всему, этот код настоятельно рекомендую вам потратить несколько часов и тщательно потратить некоторое времяс базовым руководством для начинающих.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...