Problema
Para cada una de las Species queremos quedarnos con la primera imagen (columna ID) de cada intervalo de una hora empezando por la fecha inicial: 2015-03-16 18:42:00. Es decir, para la Specie A, nos queremos quedar con P1, P3 y P4. P2 no la consideraríamos pues está dentro del intervalo de una hora a partir de P1, entre las 18:42 y las 19:41.
ID Species DateTime
1 P1 A 2015-03-16 18:42:00
2 P2 A 2015-03-16 19:34:00
3 P3 A 2015-03-16 19:58:00
4 P4 A 2015-03-16 21:02:00
5 P5 B 2015-03-16 21:18:00
6 P6 A 2015-03-16 21:19:00
7 P7 A 2015-03-16 21:33:00
8 P8 B 2015-03-16 21:35:00
9 P9 B 2015-03-16 23:43:00
- Datos
df <- read.table(
text = 'ID Species DateTime
P1 A "2015-03-16 18:42:00"
P2 A "2015-03-16 19:34:00"
P3 A "2015-03-16 19:58:00"
P4 A "2015-03-16 21:02:00"
P5 B "2015-03-16 21:18:00"
P6 A "2015-03-16 21:19:00"
P7 A "2015-03-16 21:33:00"
P8 B "2015-03-16 21:35:00"
P9 B "2015-03-16 23:43:00"',
stringsAsFactors = FALSE,
header = TRUE
)
Solución
Creamos una nueva columna con los intervalos cada 60 minutos y nos quedamos con la primera ocurrencia para cada una de las Species. Es importante señalar que dentro de la función cut tenemos que especificar 60 minutos y no una hora ("1 hour"), o de lo contrario el intervalo no tendría en cuenta los minutos sino solamente las horas. Es decir, comenzaría el primer intervalo a las 18:00 y no a las 18:42.
library(dplyr)
df$DateTime <- as.POSIXct(df$DateTime)
df %>%
mutate(by60 = cut(DateTime, "60 min")) %>%
group_by(Species, by60) %>%
slice(1) %>%
ungroup() %>%
select(-by60)
Resultados
# A tibble: 5 x 3
ID Species DateTime
1 P1 A 2015-03-16 18:42:00
2 P3 A 2015-03-16 19:58:00
3 P4 A 2015-03-16 21:02:00
4 P5 B 2015-03-16 21:18:00
5 P9 B 2015-03-16 23:43:00
Referencias
No hay comentarios:
Publicar un comentario