在R

2017-07-16 21 views
1

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

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

回答

0

编辑:离群现在是1.5 * IQR,在注释中指定。

这会用NA来替换am列中每个qsec列的异常值。它首先在一个名为limits的数据框中构建,其中包含每个群组的下限和上限。然后,将该数据框与原始数据框结合起来,并对异常值进行过滤。

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

+0

非常感谢,我有一个问题,我想找到基于Tukey 1.5 * IQR的每个列与分类变量的每个级别的异常值。 1.如何修改您的代码以将其更改为1.5 * IQR。另外,如何修改代码来查找每列的Tukey异常值并将其替换为NA。在我的真实数据集中,我有19列,我想用NA来替换每列的Tukey异常值。 – david

+0

修改queestion以使用1.5 * IQR。您可以轻松地编写遍历所有列的for循环。让我知道你是否能够这样做。如果你发现我的答案有帮助,你能接受吗?谢谢! – Florian

+0

非常感谢,当然,我会接受你的解决方案。只有两个问题。我是R新手,所以我想知道如何修改代码来处理缺少的观察结果因为我有很多缺少的观察结果。还有关于循环功能适用于所有列的任何建议。 – david