【问题标题】:Replacing outliers in whole data set (based on Tukey and each level of a categorical variable) in R在 R 中替换整个数据集中的异常值(基于 Tukey 和分类变量的每个级别)
【发布时间】:2017-07-16 14:47:21
【问题描述】:

如何根据分类变量检测所有数据集(所有连续列)的异常值并将其替换为 NA。我想使用 Tukey 技术,但专注于分类变量的每个级别。例如,根据mtcars$am 的每个级别将mtcars[, -c(8,9)] 的异常值替换为NA 或如何修改此代码以适用于 am 的每个级别中的所有变量。

lapply(mtcars, function(x){sort(outlier_values<- boxplot.stats(x)$out)})

【问题讨论】:

    标签: r outliers


    【解决方案1】:

    编辑:异常值现在是 1.5*IQR,如评论中所述。

    这会将 am 列中每组 qsec 列中的异常值替换为 NA。它首先构造一个称为限制的数据框,其中包含每个上午组的下限和上限。然后,将该数据帧与原始数据帧连接,并过滤异常值。

    library(dplyr)
    
    
    limits = data.frame(am = unique(mtcars$am))
    limits$lower = lapply(limits$am, function(x) quantile(mtcars$qsec[mtcars$am==x],0.25) - 1.5 * (quantile(mtcars$qsec[mtcars$am==x],0.75)- quantile(mtcars$qsec[mtcars$am==x],0.25)) )
    limits$upper = lapply(limits$am, function(x) quantile(mtcars$qsec[mtcars$am==x],0.75) + 1.5 * (quantile(mtcars$qsec[mtcars$am==x],0.75)- quantile(mtcars$qsec[mtcars$am==x],0.25)) )
    
    df = mtcars %>% left_join(limits)
    df$qsec = ifelse(df$qsec< df$lower | df$qsec>df$upper,NA,df$qsec) 
    df = df %>% select(-upper,-lower)
    

    a 参数可用于确定哪些比例被视为异常值。

    【讨论】:

    • 非常感谢,我有一个问题,我想找到基于 Tukey 1.5 * IQR 的每列与分类变量的每个级别的异常值。 1. 如何修改您的代码以将其更改为 1.5 * IQR。此外,如何修改您的代码以查找每列的 Tukey 异常值并将其替换为 NA。在我的真实数据集中,我有 19 列,我想用 NA 替换每列的 Tukey 异常值。
    • 修改了使用 1.5*IQR 的问题。您可以轻松编写遍历所有列的 for 循环。让我知道你是否能够这样做。如果你觉得我的回答有帮助,你能接受吗?谢谢!
    • 非常感谢,我当然会接受你的解决方案。就两个问题。我是 R 的新手,所以我想知道如何修改您的代码以处理缺失的观察,因为我有很多缺失的观察。还有关于让循环功能适用于所有列的任何建议。
    • 请参见此处:stackoverflow.com/questions/4862178/… 处理缺失值(完整的 case 语句会有所帮助)。可以像 for (col in colnames(df)){function here} 一样构造一个 for 循环,在我提到 $qsec 的任何地方,你应该指向 [col]。希望这会有所帮助!
    • @ Florian Maas,你的意思是,(colnames(mtcars) 中的 col){ limits = data.frame(am = unique(mtcars$am)) limits$lower = lapply(limits$am, function (x) 分位数(mtcars$col[mtcars$am==x],0.25) - 1.5 * (分位数(mtcars$col[mtcars$am==x],0.75)- 分位数(mtcars$col[mtcars$am= =x],0.25)) )limits$upper = lapply(limits$am, function(x) quantile(mtcars$col[mtcars$am==x],0.75) + 1.5 * (quantile(mtcars$col[mtcars$ am==x],0.75)- 分位数(mtcars$col[mtcars$am==x],0.25)) ) df = mtcars %>% left_join(limits) df$col = ifelse(df$coldf$upper,NA,df$col) df = df %>% select(-upper,-lower)}
    猜你喜欢
    • 2022-08-19
    • 1970-01-01
    • 1970-01-01
    • 2016-03-29
    • 2017-10-20
    • 1970-01-01
    • 1970-01-01
    • 2015-11-26
    • 1970-01-01
    相关资源
    最近更新 更多