Почему не учитывается разница во времени, если функция работает внутри цикла for? - PullRequest
0 голосов
/ 09 июня 2019

У меня есть ряд наблюдений за животными, связанных с временем суток. Мне нужно сгруппировать их следующим образом для последовательного анализа; все наблюдения, которые находятся на расстоянии менее 10 минут от предыдущего, относятся к одной группе. Когда наблюдение находится на расстоянии более десяти минут от предыдущего, оно начинает новую группу.

Для этого я сделал цикл for с оператором if

wilde16 <- structure(list(Species = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = "wildebeest", class = "factor"), 
    Total_Ind = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L), DateTime = structure(c(1464449354, 1464449370, 
    1464449393, 1464449402, 1464449876, 1464449954, 1464450303, 
    1464450624, 1464450640, 1464450656, 1464450953, 1464450969, 
    1464450985, 1464451132, 1464451148, 1464451165), class = c("POSIXct", 
    "POSIXt"), tzone = "Africa/Dar_es_Salaam")), row.names = c(99L, 
100L, 101L, 102L, 103L, 104L, 105L, 106L, 107L, 110L, 128L, 129L, 
132L, 142L, 144L, 146L), class = "data.frame")    

class(wilde16$DateTime)
[1] "POSIXct" "POSIXt" 

wilde16$DateTime[223]
[1] "2016-05-30 09:54:54 EAT"

z <- 0

for(i in 1:length(wilde16$DateTime)){
if(wilde16$DateTime[i+1]-wilde16$DateTime[i]<600){
    wilde16$Group[i] <- z
  } 
  else{ 
    z <- z + 1
    wilde16$Group[i] <- z
    }
 }

Тем не менее, когда я запускаю, он возвращает сообщение об ошибке

"Ошибка в if (wilde16 $ DateTime [i + 1] - wilde16 $ DateTime [i] <600) {: пропущенное значение, где требуется ИСТИНА / ЛОЖЬ "</p>

Даже если я попробую строки

i <- 1
(wilde16$DateTime[i + 1] - wilde16$DateTime[i] < 600)

возвращает

[1] FALSE

Что не так?

1 Ответ

1 голос
/ 09 июня 2019

Как заметил @Henry, у вас проблема с индексом.

Если вы пытаетесь найти интервалы на вашем векторе, вы, вероятно, можете избежать цикла for, используя функцию findInterval().

interval <- seq.POSIXt(from = min(wilde16$DateTime), to = max(wilde16$DateTime), by = "10 min")
z <- findInterval(x = wilde16$DateTime, vec = interval)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...