【问题标题】:grouping events in a time series with R用 R 对时间序列中的事件进行分组
【发布时间】:2011-11-20 20:03:31
【问题描述】:

我一直在做一些记录,试图向 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

【问题讨论】:

    标签: r time-series


    【解决方案1】:

    你必须喜欢运行长度编码,别名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 来计算运行长度的累积总和。这在现实世界中的含义是每次运行终止的索引位置。

    【讨论】:

    • ...这是一个方便的功能!
    • 太棒了!这对我来说也是一个新功能。
    • ifelse(pingLog$ms==1000, TRUE, FALSE) 可以缩短为 pingLog$ms==1000
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-26
    • 2013-07-09
    • 1970-01-01
    相关资源
    最近更新 更多