【问题标题】:delete outliers from all columns of a dataframe in r从 r 中的数据框的所有列中删除异常值
【发布时间】:2021-01-06 10:07:45
【问题描述】:

我正在尝试使用 iqr 从我的数据集中删除异常值。我得到了数据框中每一列的 iqr 值,现在我想从数据框中排除所有异常值。 我的代码是:

> q1 <- colwise(quantile)(completeData,  probs = c(.25))
> q2 <- colwise(quantile)(completeData,  probs = c(.75))
> IQR <- q2 - q1
> IQR
  MinTemp MaxTemp Rainfall Evaporation Sunshine WindGustSpeed WindSpeed9am WindSpeed3pm Humidity9am Humidity3pm Pressure9am Pressure3pm Cloud9am Cloud3pm Temp9am Temp3pm RainToday Date Location
1     9.2    10.3      2.2         4.4      7.1            19            8           11          26          31         9.6         9.7        5        4     9.3     9.9         1 1537       25
  WindGustDir WindDir3pm RainTomorrow
1           9          8            1

现在我有数据框中每个变量的 iqr 值,我想通过这种方式排除异常值:

completeData <- subset(completeData, completeDat > (q1 - 1.5*IQR) & completeData < (q2+1.5*IQR))

最后一行只是为了让你理解这个想法。最后一行的代码不起作用,我只是想要一些可以帮助我从数据框的每一列中删除所有异常值的东西。

提前感谢谁会帮助我。

【问题讨论】:

    标签: r outliers


    【解决方案1】:

    我建议不要从数据集中删除异常值,而是将它们转换为 NA,因为每列中可以有可变数量的异常值,这将为您提供不同数量的值。

    completeData <- lapply(completeData, function(x) {
      q1 <- quantile(x, .25)
      q2 <- quantile(x, .75)
      IQR <- q2 - q1
      replace(x, x < (q1 - 1.5*IQR) | x > (q2+1.5*IQR), NA)
    })
    

    【讨论】:

    • 感谢您的帮助!但如果我想删除它,我该怎么做?考虑到每个变量的不同 iqr,此代码将适用于数据框的每一列吗?非常感谢您的帮助
    • 如何处理不同数量的值,然后为每个变量获取具有相同行数的数据框?
    • @bek99 你能提供一个示例数据并显示它的预期输出,以便清楚你想要做什么。
    • 我的数据是kaggle中澳大利亚Rain的weatherAUS数据集。所需的输出应该是删除我们用 iqr 为数据帧中的每个变量找到的所有异常值。所以我用这个代码在python中做到了:#Detecting outliers with IQR Q1 = MiceImputed.quantile(0.25); Q3 = MiceImputed.quantile(0.75); IQR = Q3 - Q1;打印(IQR); # 从数据集中删除异常值 MiceImputed = MiceImputed[~((MiceImputed (Q3 + 1.5 * IQR))).any(axis=1)];
    【解决方案2】:

    要删除异常值,请尝试以下操作。
    它定义了一个要应用的函数colwise,并使用结果对数据进行子集化。

    library(plyr)
    
    outl <- function(x, na.rm = FALSE){
      qq <- quantile(x, probs = c(0.25, 0.75), na.rm = na.rm)
      iqr <- diff(qq)
      x > qq[1] - 1.5*iqr & x < qq[2] + 1.5*iqr
    }
    
    which_out <- colwise(outl)(completeData)
    

    这是删除至少有一个异常值的行。

    subset(completeData, rowSums(which_out) == ncol(which_out))
    

    这是为了保留至少有一个异常值的行。使用以下数据进行测试。

    subset(completeData, rowSums(which_out) < ncol(which_out))
    #   Sepal.Length Sepal.Width Petal.Length Petal.Width
    #16          5.7         4.4          1.5         0.4
    #33          5.2         4.1          1.5         0.1
    #34          5.5         4.2          1.4         0.2
    #61          5.0         2.0          3.5         1.0
    

    测试数据

    data(iris, package = "datasets")
    completeData <- iris[-5]
    

    【讨论】:

    • 这和在python中做这个一样吗? # 从数据集中移除异常值 MiceImputed = MiceImputed[~((MiceImputed (Q3 + 1.5 * IQR))).any(axis=1)]
    • @bek99 查看矩阵 which_out 中的内容。这是一个逻辑矩阵,每一列都给出了条目是否是异常值。然后您可以使用矩阵来保留或删除您想要的内容,rowSums 的两个示例并不是which_out 可能的唯一用途。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-22
    • 2018-12-16
    • 1970-01-01
    • 1970-01-01
    • 2020-07-26
    • 2011-02-08
    相关资源
    最近更新 更多