用于查找异常的子设置

时间:2018-03-28 15:43:48

标签: r dataframe zoo

在数据框中,我试图寻找远离平均值(阈值* s.d.)的数据点。数据框的dim如下:

[1] 4032    4

为了找到上述条件的数据点,我做了:

df$mean = rollapply(df$value, width = 2, FUN = mean, align = "right", fill = "extend")

df$sd = rollapply(df$value, width = 2, FUN = sd,  align = "right", fill = "extend")

在上述head(df)之后看起来像:

            timestamp  value   mean        sd
2007-03-14 1393577520 37.718 38.088 0.5232590
2007-03-15 1393577220 38.458 38.088 0.5232590
2007-03-16 1393576920 37.912 38.185 0.3860803
2007-03-17 1393576620 40.352 39.132 1.7253405
2007-03-18 1393576320 38.474 39.413 1.3279465
2007-03-19 1393576020 39.878 39.176 0.9927779

要查找数据点:

anomaly = df[df$value > abs((threshold*df$sd + df$mean) | 
                                (df$mean - threshold*df$sd)),]

高于找到远离均值(阈值* s.d.)的数据点的正确方法。我怀疑的原因是dim anomalydf的{​​{1}}相同。

1 个答案:

答案 0 :(得分:1)

这样做

# creating some dummy data
m <- matrix(runif(16128,-1,1), ncol = 4)

tresh <- .004+1
m[which(abs(m-mean(m)) > tresh*sd(m), arr.ind = T)]

其中m表示您的矩阵(或您的列value取决于您采用的均值/ sd)和tresh您的阈值。

更新以下是我的结果中的前几个条目:

dat <- df$value[which(abs(df$value-mean(df$value)) > tresh*sd(df$value))]
head(dat)
[1] 51.846 48.568 44.986 49.108 53.404 46.314