在 R 中替换整个数据集中的异常值(基于 Tukey 和分类变量的每个级别)

Replacing outliers in whole data set (based on Tukey and each level of a categorical variable) in R

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

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

EDIT: outliers are now 1.5*IQR, as specified in comment.

这用 NA 替换了 am 列中每组的 qsec 列中的异常值。它通过首先构建一个名为 limits 的数据框来实现,该数据框包含每个 am 组的下限和上限。然后,将该数据框与原始数据框合并,并过滤异常值。

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 参数可用于确定什么比例被视为异常值。