在 R 中使用 map 函数进行过滤
Filter with map function in R
我正在尝试过滤数据框的多列 (15)。具体来说,我想使用 Q3 + IQR1.5 和 Q1 - IQR1.5 方法移除异常值。
玩具示例:
library(tidyverse)
aa <- c(2,3,4,3,2,2,1,6,5,4,3,1,15)
bb <- c(0.2,20,30,40,30,20,20,10,30,40,30,10,10)
cc <- c(-9,2,3,4,3,2,2,1,5,4,3,1,25)
df <- tibble(aa,bb,cc)
我试过没有成功:
i <- NULL
for(i in 1:ncol(fat)){
po <- fat %>%
filter(.[[i]] >= (quantile(.[[i]], .25) - IQR(.[[i]]) * 1.5))
po <- fat %>%
filter(.[[i]] <= (quantile(.[[i]], .75) + IQR(.[[i]]) * 1.5))
}
我可以使用过滤器和映射函数来执行此操作吗?以及如何?
非常感谢
GS
我们可以使用 filter
和 if_all/across
library(dplyr)
df %>%
filter(if_all(where(is.numeric), ~ (.>= (quantile(., .25) - IQR(.) * 1.5 )) &
(.<= (quantile(., .75) + IQR(.) * 1.5 ))))
这里有几个使用 sapply
/lapply
的基本 R 选项。我们编写了一个自定义函数来检测异常值并将其应用于每一列,并且 select 仅应用于其中没有异常值的行。
is_outlier <- function(x) {
x <= (quantile(x, .25) - IQR(x) * 1.5) | x >= (quantile(x, .75) + IQR(x) * 1.5)
}
df[!Reduce(`|`, lapply(df, is_outlier)), ]
# aa bb cc
# <dbl> <dbl> <dbl>
# 1 3 20 2
# 2 4 30 3
# 3 3 40 4
# 4 2 30 3
# 5 2 20 2
# 6 1 20 2
# 7 6 10 1
# 8 5 30 5
# 9 4 40 4
#10 3 30 3
#11 1 10 1
使用sapply
-
df[rowSums(sapply(df, is_outlier)) == 0, ]
我正在尝试过滤数据框的多列 (15)。具体来说,我想使用 Q3 + IQR1.5 和 Q1 - IQR1.5 方法移除异常值。
玩具示例:
library(tidyverse)
aa <- c(2,3,4,3,2,2,1,6,5,4,3,1,15)
bb <- c(0.2,20,30,40,30,20,20,10,30,40,30,10,10)
cc <- c(-9,2,3,4,3,2,2,1,5,4,3,1,25)
df <- tibble(aa,bb,cc)
我试过没有成功:
i <- NULL
for(i in 1:ncol(fat)){
po <- fat %>%
filter(.[[i]] >= (quantile(.[[i]], .25) - IQR(.[[i]]) * 1.5))
po <- fat %>%
filter(.[[i]] <= (quantile(.[[i]], .75) + IQR(.[[i]]) * 1.5))
}
我可以使用过滤器和映射函数来执行此操作吗?以及如何?
非常感谢 GS
我们可以使用 filter
和 if_all/across
library(dplyr)
df %>%
filter(if_all(where(is.numeric), ~ (.>= (quantile(., .25) - IQR(.) * 1.5 )) &
(.<= (quantile(., .75) + IQR(.) * 1.5 ))))
这里有几个使用 sapply
/lapply
的基本 R 选项。我们编写了一个自定义函数来检测异常值并将其应用于每一列,并且 select 仅应用于其中没有异常值的行。
is_outlier <- function(x) {
x <= (quantile(x, .25) - IQR(x) * 1.5) | x >= (quantile(x, .75) + IQR(x) * 1.5)
}
df[!Reduce(`|`, lapply(df, is_outlier)), ]
# aa bb cc
# <dbl> <dbl> <dbl>
# 1 3 20 2
# 2 4 30 3
# 3 3 40 4
# 4 2 30 3
# 5 2 20 2
# 6 1 20 2
# 7 6 10 1
# 8 5 30 5
# 9 4 40 4
#10 3 30 3
#11 1 10 1
使用sapply
-
df[rowSums(sapply(df, is_outlier)) == 0, ]