如果从数据帧中的每个列检测到异常值(例如99%分位数),则删除COMPLETE行

时间:2018-01-26 08:49:43

标签: r dplyr outliers quantile

我们说这是我的数据框架。

MyData <- data.frame(
+     X = sample(10:100, 21),
+     Y = sample(10:100, 21),
+     Z = sample(10:100, 21)
+ )

我了解如何使用sapplyapply打印每列的分位数:

> apply( MyData , 2, quantile , .99 , na.rm = TRUE )
   X    Y    Z 
98.0 97.6 92.8 
> sapply( MyData , quantile , .99 , na.rm = TRUE )
X.99% Y.99% Z.99% 
 98.0  97.6  92.8

但是,如果检测到高于此阈值的值,则删除整个ROW - 这对于EACH列而言 - 对我来说不起作用。任何解决方案 - 有或没有dplyr表示赞赏。

3 个答案:

答案 0 :(得分:2)

以下是使用cut的解决方案:

set.seed(123)
MyData <- data.frame(
    X = sample(10:100, 21),
    Y = sample(10:100, 21),
    Z = sample(10:100, 21)
)
head(MyData, 4)
#>    X  Y  Z
#> 1 36 73 47
#> 2 80 67 43
#> 3 46 98 23
#> 4 87 99 22
apply(MyData, 2, quantile, .95)
#>  X  Y  Z 
#> 97 98 83
tmp1 <- apply(MyData, 2, function(x) cut(x, c(-Inf, quantile(x, probs = .95), Inf), labels = FALSE))
MyData[tmp1 == 2] <- NA
head(MyData, 4)
#>    X  Y  Z
#> 1 36 73 47
#> 2 80 67 43
#> 3 46 98 23
#> 4 87 NA 22
head(na.omit(MyData), 4)
#>    X  Y  Z
#> 1 36 73 47
#> 2 80 67 43
#> 3 46 98 23
#> 5 91 71 30

答案 1 :(得分:2)

您可以与分位数进行比较以获得TRUE和FALSE矩阵,然后对没有列包含TRUE的行进行子集

set.seed(26L)
MyData <- as.matrix(data.frame(
    X = sample(10:100, 21),
    Y = sample(10:100, 21),
    Z = sample(10:100, 21)
))

数据:

Response.data

答案 2 :(得分:2)

我们可以使用filter_all中的dplyr来过滤每个列条件的行。 all_vars表示所有列都需要满足条件。

set.seed(123)
MyData <- data.frame(
  X = sample(10:100, 21),
  Y = sample(10:100, 21),
  Z = sample(10:100, 21)
)

head(MyData)
#   X  Y  Z
# 1 36 73 47
# 2 80 67 43
# 3 46 98 23
# 4 87 99 22
# 5 91 71 30
# 6 13 56 50

library(dplyr)

MyData2 <- MyData %>% filter_all(all_vars(. <= quantile(., 0.99, na.rm = TRUE)))

head(MyData2)
#    X  Y  Z
# 1 36 73 47
# 2 80 67 43
# 3 46 98 23
# 4 91 71 30
# 5 13 56 50
# 6 54 60 32