Я попал туда с dplyr
.Немного сложно получить ожидаемый результат.Я надеюсь, что есть более простой способ.Может быть, кто-то с лучшими знаниями data.table
может предоставить решение data.table
.
Сначала создайте групповой оператор, чтобы вычислить разницу во времени в минутах, и если для значения меньше 5 минут установлено значение 0. Это гарантирует, что записив течение 5 минут получите ту же минуту.Затем избавьтесь от времени и расширите группировку, включив минутыПодсчитайте, сколько записей попадает в эти группы.Удалите минуты из группировки, сделайте отдельное, чтобы избавиться от двойных записей X1 A1 и, наконец, удалите столбец min.
library(dplyr)
df %>%
group_by(First, Second) %>%
mutate(min = (Time - lag(Time, default = first(Time)))/60,
min = ifelse(min < 5, 0, min)) %>%
select(-Time) %>%
group_by(First, Second, min) %>%
mutate(n = n()) %>%
ungroup(min) %>%
distinct() %>%
select(-min)
# A tibble: 5 x 3
First Second n
<chr> <chr> <int>
1 X1 A1 2
2 X2 A2 1
3 X3 B3 1
4 X3 B3 1
5 X2 C4 1
Данные:
df <- structure(list(Time = structure(c(1504250463, 1525492739, 1514804806, 1504250591, 1514805612, 1525492550),
class = c("POSIXct", "POSIXt"), tzone = ""),
First = c("X1", "X2", "X3", "X1", "X3", "X2"),
Second = c("A1", "A2", "B3", "A1", "B3", "C4")),
.Names = c("Time", "First", "Second"),
row.names = c(NA, -6L),
class = "data.frame")