我在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:31,2018-01-31 08:22:17
Anomaly 2,1188-01-31 08:35:27,2018-01-31 08:49:08
答案 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