Вот решение с использованием пакетов dplyr
, magrittr
и lubridate
.
IN<-read.table(header = FALSE, text = "2018-06-01_04:29:47
2018-06-01_05:44:41
2018-06-01_05:44:43
2018-06-01_05:44:45
2018-06-01_05:57:54
2018-06-01_05:57:56
2018-06-01_05:57:58
2018-06-01_08:10:35
2018-06-01_08:41:20
2018-06-01_08:41:22
2018-06-01_08:41:24
2018-06-01_08:52:01
2018-06-01_09:02:13
2018-06-01_09:22:45", quote="\n",col.names="time")
IN$time<-as.POSIXct(IN$time, "%Y-%m-%d_%H:%M:%S",tz="")
Я удалил пустую первую строку фрейма входных данных, так как это вызывало проблемы.Следующая функция фильтрует фрейм данных для этих элементов в течение 60 секунд до заданного ref_time
и подсчитывает количество строк, используя nrow
.
event_count <- function(ref_time){
IN %>% filter(time %within% interval(ref_time - 60, ref_time)) %>% nrow
}
Здесь я применяю функцию построчномода, записывать счет и сортировать по времени.(Возможно, нет необходимости ...) Результаты передаются обратно во входной фрейм данных с использованием составного канала назначения из magrittr
.
IN %<>%
rowwise() %>%
mutate(counts = event_count(time)) %>%
arrange(time)
Наконец, результаты.
# A tibble: 14 x 2
# time counts
# <dttm> <int>
# 1 2018-06-01 04:29:47 1
# 2 2018-06-01 05:44:41 1
# 3 2018-06-01 05:44:43 2
# 4 2018-06-01 05:44:45 3
# 5 2018-06-01 05:57:54 1
# 6 2018-06-01 05:57:56 2
# 7 2018-06-01 05:57:58 3
# 8 2018-06-01 08:10:35 1
# 9 2018-06-01 08:41:20 1
# 10 2018-06-01 08:41:22 2
# 11 2018-06-01 08:41:24 3
# 12 2018-06-01 08:52:01 1
# 13 2018-06-01 09:02:13 1
# 14 2018-06-01 09:22:45 1
Я думаю, что @PoGibas намекает на то, что по какой-то причине во фрейме входных данных есть две записи со временем 2018-06-01 05:57:54
.Я не уверен, откуда взялась вторая ...
РЕДАКТИРОВАТЬ: это новая строка в таблице чтения, которая портит его.
РЕДАКТИРОВАТЬ²: Это возвращает максимум3 ...
event_count <- function(ref_time){
min(IN %>% filter(time %within% interval(ref_time - 60, ref_time)) %>% nrow, 3)
}