Вы должны любить кодирование длины выполнения, псевдоним rle
:
offline <- ifelse(pingLog$ms==1000, TRUE, FALSE)
rleOffline <- rle(offline)
offlineTable <- data.frame(
endtime = pingLog$time[cumsum(rleOffline$lengths)],
duration = rleOffline$lengths * 5,
offline = rleOffline$values
)
Результаты:
offlineTable
endtime duration offline
1 2011-11-20 13:20:19 1030 FALSE
2 2011-11-20 13:20:35 5 TRUE
3 2011-11-20 13:24:37 240 FALSE
4 2011-11-20 13:25:57 25 TRUE
5 2011-11-20 13:53:28 1640 FALSE
Почему это работает?
Сначала создайте логический вектор, который показывает онлайн и офлайн.ifelse
удобно для этого.
offline <- ifelse(pingLog$ms==1000, TRUE, FALSE)
Затем используйте rle
для вычисления кодировки длины серии:
rle(offline)
Run Length Encoding
lengths: int [1:5] 206 1 48 5 328
values : logi [1:5] FALSE TRUE FALSE TRUE FALSE
В этой таблице указано, сколько прогонов равно ИСТИНА или ЛОЖЬпроизошло, а также, как долго длился каждый забег.В этом случае первый прогон состоял из 206 периодов со значением FALSE (т. Е. Он-лайн в течение 206 * 5 = 1030 секунд.
. Последний шаг - использование информации rle
для индексации по отношению к исходному * 1022.* чтобы найти время. Дополнительным волшебством является использование cumsum
для вычисления кумулятивной суммы длин серий. Реальным значением этого является индексная позиция, где каждый цикл завершился.