gpt4 book ai didi

r - 使用R将时间序列中的事件分组

转载 作者:行者123 更新时间:2023-12-04 03:40:02 25 4
gpt4 key购买 nike

我一直在做一些日志记录,以尝试向Comcast Business说明他们在我办公室的服务中断的频率。我将ping响应时间记录到一个文件中,然后用R解析该文件。在日志文件中,值1000表示ping超时。我的脚本每5秒记录一次ping。因此,如果我的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

最佳答案

您一定喜欢Run length编码,别名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
该表告诉您执行了TRUE或FALSE运行了多少次,以及每次运行了多长时间。在这种情况下,第一次运行是206个周期,值为FALSE(即在线206 * 5 = 1030秒)。
最后一步是使用 rle信息对原始 pingLog进行索引以找到时间。神奇的一点是使用 cumsum计算游程长度的累积和。实际含义是每次运行终止的索引位置。

关于r - 使用R将时间序列中的事件分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8204290/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com