首页 > 解决方案 > 删除异常值

问题描述

我有一个包含 2000 多个观测值的大型数据集。数据涉及动物组织中的毒素浓度。我的响应变量是myRESULT,并且我对每个ANALYTE感兴趣的都有多个观察结果。ANALYTE我需要从每个组中删除异常值,这些异常值由距离平均值超过三个 SD 的数字定义。

虽然我意识到我不应该正常地从数据集中删除异常值,但我仍然想知道如何在 R 中做到这一点。

这是我的数据的一小部分:

数据

标签: routliers

解决方案


它是按组划分的,可以通过不同的方式完成。使用 dplyr,您group_by可以设置分组,然后设置filter行子集,传递给它一个表达式,该表达式将计算TRUE要保留的行和FALSE异常值的返回值。

例如,使用iris和 2 个标准差(一切都在 3 以内):

library(dplyr)

iris_clean <- iris %>% 
    group_by(Species) %>% 
    filter(abs(Petal.Length - mean(Petal.Length)) < 2*sd(Petal.Length))

iris_clean %>% count()
#> # A tibble: 3 x 2
#> # Groups:   Species [3]
#>   Species        n
#>   <fct>      <int>
#> 1 setosa        46
#> 2 versicolor    47
#> 3 virginica     47

使用基础 R 中的拆分应用组合方法,

do.call(rbind, lapply(
    split(iris, iris$Species), 
    function(x) x[abs(x$Petal.Length - mean(x$Petal.Length)) < 2*sd(x$Petal.Length), ]
))

推荐阅读