检测连续发生并填充开始和结束日期

时间:2018-03-20 02:49:53

标签: r

我在R中有一个数据框,我想检测Anomaly的连续周期。下面是一个例子,有没有办法做到这一点?

在:

> dput(head(table))

structure(list(Anomaly = structure(c(1L, 1L, 2L, 2L, 1L, 2L), .Label = c("No Anomaly", 
"Anomaly"), class = "factor"), Starttime = structure(c(1517385625.68442, 
1517385922.68722, 1517386231.1695, 1517386508.06496, 1517386945.86432, 
1517387727.89725), class = c("POSIXct", "POSIXt"), tzone = "GMT"), 
    Endtime = structure(c(1517385922.68714, 1517386231.1695, 
    1517386508.06496, 1517386937.51527, 1517387727.89725, 1517388548.49825
    ), class = c("POSIXct", "POSIXt"), tzone = "GMT")), .Names = c("Anomaly", 
"Starttime", "Endtime"), row.names = c(NA, 6L), class = "data.frame")

后:

异常,开始时间,结束时间

Anomaly 1,2018-01-31 08:10:3​​1,2018-01-31 08:22:17

Anomaly 2,1188-01-31 08:35:27,2018-01-31 08:49:08

1 个答案:

答案 0 :(得分:1)

我们可以使用rleid中的data.table来创建分组列

library(data.table)

然后搜索

?rleid

根据?rleid

的描述
  

用于生成游程长度类型id列的便捷函数   用于分组操作。它接受原子矢量,列表,   data.frames或data.tables作为输入。

setDT(df1)[, .SD[Anomaly == "Anomaly"], rleid(Anomaly)]

setDT将'data.frame'转换为'data.table',按'异常'的run-length-id分组,过滤Data.table的子集行({{1并且应用逻辑

假设,如果我们需要获得每个连续'异常'的第一个和最后一个'Starttime','Endtime'

Anomaly == "Anomaly"

或另一个选项是使用setDT(df1)[, {i1 <- Anomaly == 'Anomaly' .(Starttime = Starttime[i1][1], Endtime = Endtime[i1][.N])}, by = .(grp = rleid(Anomaly)) ][!is.na(Starttime)][, grp := paste0("Anomaly", seq_len(.N))][] # grp Starttime Endtime #1: Anomaly1 2018-01-31 08:10:31 2018-01-31 08:22:17 #2: Anomaly2 2018-01-31 08:35:27 2018-01-31 08:49:08 ,通过检查“异常”中的相邻元素来创建分组变量然后tidyverse

summarise