Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 如果从数据帧中的每一列检测到异常值(例如99%分位数),则删除整行_R_Dplyr_Outliers_Quantile - Fatal编程技术网

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
from
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
set.seed(123)

MyData我们可以使用
filter\u all
from
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
set.seed(123)

MyData使用
cut
和计算出的分位数作为
break
参数。高于哪个阈值?@Sam:在上面的示例中,我使用了.99。类似的。使用
cut
和计算出的分位数作为
break
参数。超过哪个阈值?@Sam:在上面的示例中,我使用了.99。差不多吧。谢谢。那真的很好。我的错:我不够清楚。我编辑了我的问题,因为我想删除整行。因此,在您的情况下,
>4 87 NA 22
必须从df中完成。有什么想法吗?@AmirRahbaran
na.omit(MyData)
会删除带有
na
.Thx的行,谢谢你的回答。投票支持你的答案和所有评论。我选择@www作为选择的答案,因为它用一行code.Thx解决了这个问题。那真的很好。我的错:我不够清楚。我编辑了我的问题,因为我想删除整行。因此,在您的情况下,
>4 87 NA 22
必须从df中完成。有什么想法吗?@AmirRahbaran
na.omit(MyData)
会删除带有
na
.Thx的行,谢谢你的回答。投票支持你的答案和所有评论。我选择@www作为选择的答案,因为它用一行代码解决了这个问题。Thx很多,我不太清楚
filter\u all
是如何工作的。一个很好的用例。Thx很多,我不太清楚
filter\u all
是如何工作的。一个好的用例。