R 如果从数据帧中的每一列检测到异常值(例如99%分位数),则删除整行
假设这是我的数据帧R 如果从数据帧中的每一列检测到异常值(例如99%分位数),则删除整行,r,dplyr,outliers,quantile,R,Dplyr,Outliers,Quantile,假设这是我的数据帧 MyData <- data.frame( + X = sample(10:100, 21), + Y = sample(10:100, 21), + Z = sample(10:100, 21) + ) 但是,如果检测到一个高于此阈值的值,则删除整行—并且每个列都是如此—对我来说不起作用。任何解决方案–无论是否使用dplyr,我们都将不胜感激。以下是使用cut的解决方案: set.seed(123) MyData X Y Z #> 1 36
MyData <- data.frame(
+ X = sample(10:100, 21),
+ Y = sample(10:100, 21),
+ Z = sample(10:100, 21)
+ )
但是,如果检测到一个高于此阈值的值,则删除整行—并且每个列都是如此—对我来说不起作用。任何解决方案–无论是否使用
dplyr
,我们都将不胜感激。以下是使用cut
的解决方案:
set.seed(123)
MyData X Y Z
#> 1 36 73 47
#> 2 80 67 43
#> 3 46 98 23
#> 4 87 99 22
应用(MyData,2,分位数,.95)
#>X Y Z
#> 97 98 83
tmp1 1 36 73 47
#> 2 80 67 43
#> 3 46 98 23
#>4 87 NA 22
标题(不适用(MyData),4)
#>X Y Z
#> 1 36 73 47
#> 2 80 67 43
#> 3 46 98 23
#> 5 91 71 30
这里有一个使用cut
的解决方案:
set.seed(123)
MyData X Y Z
#> 1 36 73 47
#> 2 80 67 43
#> 3 46 98 23
#> 4 87 99 22
应用(MyData,2,分位数,.95)
#>X Y Z
#> 97 98 83
tmp1 1 36 73 47
#> 2 80 67 43
#> 3 46 98 23
#>4 87 NA 22
标题(不适用(MyData),4)
#>X Y Z
#> 1 36 73 47
#> 2 80 67 43
#> 3 46 98 23
#> 5 91 71 30
您可以与分位数进行比较,得到一个TRUE和FALSE矩阵,然后将没有列包含TRUE的行子集
MyData[!apply(apply(MyData, 2, function(x) x > quantile(x, 0.99)), 1, any), ]
数据:
set.seed(26L)
MyData您可以将其与分位数进行比较,得到一个TRUE和FALSE的矩阵,然后对没有包含TRUE的列的行进行子集
MyData[!apply(apply(MyData, 2, function(x) x > quantile(x, 0.99)), 1, any), ]
数据:
set.seed(26L)
MyData我们可以使用filter\u all
fromdplyr
为每一列筛选条件行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
set.seed(123)
MyData我们可以使用filter\u all
fromdplyr
为每一列筛选条件行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
set.seed(123)
MyData使用cut
和计算出的分位数作为break
参数。高于哪个阈值?@Sam:在上面的示例中,我使用了.99。类似的。使用cut
和计算出的分位数作为break
参数。超过哪个阈值?@Sam:在上面的示例中,我使用了.99。差不多吧。谢谢。那真的很好。我的错:我不够清楚。我编辑了我的问题,因为我想删除整行。因此,在您的情况下,>4 87 NA 22
必须从df中完成。有什么想法吗?@AmirRahbaranna.omit(MyData)
会删除带有na
.Thx的行,谢谢你的回答。投票支持你的答案和所有评论。我选择@www作为选择的答案,因为它用一行code.Thx解决了这个问题。那真的很好。我的错:我不够清楚。我编辑了我的问题,因为我想删除整行。因此,在您的情况下,>4 87 NA 22
必须从df中完成。有什么想法吗?@AmirRahbaranna.omit(MyData)
会删除带有na
.Thx的行,谢谢你的回答。投票支持你的答案和所有评论。我选择@www作为选择的答案,因为它用一行代码解决了这个问题。Thx很多,我不太清楚filter\u all
是如何工作的。一个很好的用例。Thx很多,我不太清楚filter\u all
是如何工作的。一个好的用例。