Example using mtcars dataset for data.
library(tidyverse)
df_of_interest <- mtcars
#the data.frame may contain more than only number columns,
# so determine the names of the number columns
(to_do <- df_of_interest %>%
select(where(is.numeric)) %>%
names())
# calculated first and 3rd quartile
calc_quants <- function(x) {
map(
to_do,
~ {
enframe(quantile(x[[.]], probs = c(.25, .75)),
value = .
)
}
) %>% reduce(left_join)
}
(inner_quartile_df <- calc_quants(df_of_interest))
# re organise quartile info
(iq_df2 <- inner_quartile_df %>%
rename(quantile = name) %>%
pivot_longer(cols = -"quantile") %>%
group_by(quantile) %>%
group_split())
(iqr_df <- left_join(iq_df2[[1]],
iq_df2[[2]],
by = "name"
) %>%
select(name, lower = value.x, upper = value.y) %>%
mutate(
iqr = upper - lower,
low_crit = lower - iqr * 1.5,
hi_crit = upper + iqr * 1.5
))
# for each column to process, determing the rows it would omit,
# collate these
(rows_to_omit <- map(
to_do,
~ {
ovec <- pull(
df_of_interest,
.x
)
criteria <- filter(iqr_df, name == .x)
which(!between(
x = ovec, left = criteria$low_crit,
right = criteria$hi_crit
))
}
) %>% unlist() %>% sort() %>% unique())
# finish
new_data <- df_of_interest %>%
slice(-rows_to_omit)