【问题标题】:How to detect univariate outliers and mark as TRUE or FALSE in new column如何检测单变量异常值并在新列中标记为 TRUE 或 FALSE
【发布时间】:2020-01-04 05:17:45
【问题描述】:

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

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

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

即:

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

quantile(df$a, 0.997, na.rm = T)

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

df$outliers <- (df$a <- df$a <2.5 | df$a > 10.5)

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

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

最好的方法是什么?

【问题讨论】:

    标签: r dataframe outliers


    【解决方案1】:

    假设您的数据框名为df,您有兴趣检查异常值的列是abc(存储在cols 中)。我们可以在这些列上使用sapply 找出哪个值位于异常值范围内。这将返回一个由TRUE/FALSE 值组成的矩阵,指示该特定值是否为异常值。我们取 rowSums 并赋值 TRUE 如果任何一列在该行中有 TRUE 值或 FALSE 否则。

    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
    

    数据

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

    【讨论】:

    • 您好 Ronak,感谢您的回复 - 这正是我希望实现的目标。不幸的是,我收到以下错误:“[.data.table(df, cols) 中的错误:当 i 是 data.table(或字符向量)时,必须使用 'on=' 参数指定要连接的列(参见 ?data.table) 或通过键入 x (即已排序,并且,标记为已排序,请参见你知道问题可能是什么吗?干杯!
    • @stat.chat 你有data.table,你能不能把它改成data.frame df1 &lt;- data.frame(df) 然后上面试试?
    • 嗨罗纳克,谢谢。我还有另一个错误。对不起,我对 R 还是很陌生!错误是:“如果 na.rm 为 FALSE,则不允许缺少值和 NaN。”我尝试将 na.rm = TRUE 添加到代码中,无论是在 [cols] 之后还是在最后一个括号之前,但是它不起作用并弹出“意外符号错误”。我应该把 na.rm= T 放在哪里?
    • 我在 sappy 之后添加了 na.rm,即:sapply, na.rm = T(df[cols], function ... 但是现在我收到此错误:错误:尝试应用非功能
    • @stat.chat 您需要将其添加到quantile 函数中。试试df$outliers &lt;- rowSums(sapply(df[cols], function(x) x &lt; quantile(x, 0.003, na.rm = TRUE) | x &gt; quantile(x, 0.997, na.rm = TRUE))) &gt; 0
    【解决方案2】:

    一般来说,如果一个或多个特征的观察值是异常值,那么它就是异常值。但我不知道你在处理什么,所以它可能会有所不同,你必须找到你处理的问题如何定义异常值,然后你可以选择重要的特征和阈值。

    回到第一个定义,您可以将列创建为您为所有变量创建的同一过程的结果的交集。

    但是您应该避免手动执行此操作,因此您创建一个包含所有变量阈值的表,然后创建一个函数,如果观察结果是至少一个变量的异常值,则返回 trur

    【讨论】:

      猜你喜欢
      • 2012-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-15
      • 2017-06-19
      • 2017-03-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多