группировка событий во временном ряду с R - PullRequest
9 голосов
/ 21 ноября 2011

Я занимался регистрацией, чтобы попытаться проиллюстрировать Comcast Business частоту прерывания их обслуживания в моем офисе.Я записываю время отклика ping в файл, затем анализирую этот файл с помощью R. В файле журнала значение 1000 означает истечение времени ожидания ping.Мой скрипт регистрирует пинг каждые 5 секунд.Поэтому, если моя служба Comcast будет недоступна в течение 30 секунд, что приведет к ~ 6 записям журнала со значением 1000. Я хотел бы проанализировать свои журналы таким образом, чтобы я мог создать сводную таблицу, которая показывала, когда начиналось каждое отключение,как долго это продолжалосьКакие есть хорошие способы сделать это?

Вот некоторые примеры данных за сегодня и несколько графиков, которые иллюстрируют мой временной ряд:

require(xts)
outFile <- "http://pastebin.com/raw.php?i=SJuMQ9rD"
pingLog <- read.csv(outFile, header=FALSE, 
     col.names = c("time","ms"), 
     colClasses=c("POSIXct", "numeric"))
xPingLog <- as.xts(pingLog$ms, order.by=pingLog$time)
outages <- subset(pingLog, ms==1000)
xOutages <- as.xts(outages$ms, order.by=outages$time)

par(mfrow=c(2,1))
plot(xPingLog)
plot(outages)
outages

1 Ответ

12 голосов
/ 21 ноября 2011

Вы должны любить кодирование длины выполнения, псевдоним 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 для вычисления кумулятивной суммы длин серий. Реальным значением этого является индексная позиция, где каждый цикл завершился.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...