如何检测单变量异常值并在新列中标记为 TRUE 或 FALSE

sta*_*hat 5 r outliers dataframe

我有一个包含 30 列和 >10,000 行的数据框。

我如何对一组变量运行异常值分析,如果任何变量超过特定阈值(对于该给定变量),则返回 TRUE,如果不满足任何异常值阈值 (3SD),则返回 FALSE变量,TRUE/FALSE 值显示在新列中?

我使用分位数来找到每个变量的 3 个标准偏差截止值:

IE:

quantile(df$a, 0.003, na.rm = T) #and 

quantile(df$a, 0.997, na.rm = T)
Run Code Online (Sandbox Code Playgroud)

假设第一个值是 2.5,这个变量的上限值是 10.5,然后我创建了一个新变量:

df$outliers <- (df$a <- df$a <2.5 | df$a > 10.5)
Run Code Online (Sandbox Code Playgroud)

当 a 列中的值小于 2.5 或大于 10.5 时,它给出 TRUE 值。

我想做的是让 df$outliers 代表一组列的异常值状态,而不仅仅是一个列,即列 d、e、f、g、l、m 等,它们都有自己的阈值遇见。

做这个的最好方式是什么?

Ron*_*hah 3

假设您的数据框被调用df,并且您有兴趣检查异常值的列是abc(存储在cols)。我们可以sapply在这些列上使用找出哪些值位于异常值范围内。TRUE这将返回/值的矩阵,FALSE指示该特定值是否为异常值。如果任何一列在该行或其他列中具有值,我们就会rowSums对其进行赋值。TRUETRUEFALSE

cols <- c("a", "b", "c")

df$outliers <- rowSums(sapply(df[cols], function(x) 
                       x < quantile(x, 0.003) | x > quantile(x, 0.997))) > 0

df
#             a          b          c random outliers
#1  -0.56047565  1.2240818 -1.0678237      1    FALSE
#2  -0.23017749  0.3598138 -0.2179749      2    FALSE
#3   1.55870831  0.4007715 -1.0260044      3    FALSE
#4   0.07050839  0.1106827 -0.7288912      4    FALSE
#5   0.12928774 -0.5558411 -0.6250393      5    FALSE
#6   1.71506499  1.7869131 -1.6866933      6     TRUE
#7   0.46091621  0.4978505  0.8377870      7    FALSE
#8  -1.26506123 -1.9666172  0.1533731      8     TRUE
#9  -0.68685285  0.7013559 -1.1381369      9    FALSE
#10 -0.44566197 -0.4727914  1.2538149     10     TRUE
Run Code Online (Sandbox Code Playgroud)

数据

set.seed(123)
df <- data.frame(a = rnorm(10), b = rnorm(10), c = rnorm(10), random = 1:10)
Run Code Online (Sandbox Code Playgroud)