Разделите задачи:
- Определите выбросы в числовом c векторе, используя метод IQR. Это может быть заключено в функцию, принимающую вектор.
- Удаляет выбросы из нескольких столбцов data.frame. Это функция, принимающая data.frame.
Я бы предложил возвращать логический вектор, а не индексы. Таким образом, возвращаемое значение - это размер данных, который облегчает создание нового столбца, например df$outlier <- is_outlier(df$measure1)
.
Обратите внимание, как имена аргументов дают понять, какой тип ввода ожидается: x
- это стандартное имя для вектора чисел c, а df
- это, очевидно, фрейм данных. cols
- это, вероятно, список или вектор имен столбцов.
Я указал на необходимость использовать только базу R, но в реальной жизни я бы использовал пакет dplyr
для манипулирования данными. Frame.
#' Detect outliers using IQR method
#'
#' @param x A numeric vector
#' @param na.rm Whether to exclude NAs when computing quantiles
#'
is_outlier <- function(x, na.rm = FALSE) {
qs = quantile(x, probs = c(0.25, 0.75), na.rm = na.rm)
lowerq <- qs[1]
upperq <- qs[2]
iqr = upperq - lowerq
extreme.threshold.upper = (iqr * 3) + upperq
extreme.threshold.lower = lowerq - (iqr * 3)
# Return logical vector
x > extreme.threshold.upper | x < extreme.threshold.lower
}
#' Remove rows with outliers in given columns
#'
#' Any row with at least 1 outlier will be removed
#'
#' @param df A data.frame
#' @param cols Names of the columns of interest. Defaults to all columns.
#'
#'
remove_outliers <- function(df, cols = names(df)) {
for (col in cols) {
cat("Removing outliers in column: ", col, " \n")
df <- df[!is_outlier(df[[col]]),]
}
df
}
Вооружившись этими двумя функциями, это становится очень просто:
df <- data.frame(ID = c(1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, 1011),
measure1 = rnorm(11, mean = 8, sd = 4),
measure2 = rnorm(11, mean = 40, sd = 5),
measure3 = rnorm(11, mean = 20, sd = 2),
measure4 = rnorm(11, mean = 9, sd = 3))
vars_of_interest <- c("measure1", "measure3", "measure4")
df_filtered <- remove_outliers(df, vars_of_interest)
#> Removing outliers in column: measure1
#> Removing outliers in column: measure3
#> Removing outliers in column: measure4
df_filtered
#> ID measure1 measure2 measure3 measure4
#> 1 1001 9.127817 40.10590 17.69416 8.6031175
#> 2 1002 18.196182 38.50589 23.65251 7.8630485
#> 3 1003 10.537458 37.97222 21.83248 6.0798316
#> 4 1004 5.590463 46.83458 21.75404 6.9589981
#> 5 1005 14.079801 38.47557 20.93920 -0.6370596
#> 6 1006 3.830089 37.19281 19.56507 6.2165156
#> 7 1007 14.644766 37.09235 19.78774 10.5133674
#> 8 1008 5.462400 41.02952 20.14375 13.5247993
#> 9 1009 5.215756 37.65319 22.23384 7.3131715
#> 10 1010 14.518045 48.97977 20.33128 9.9482211
#> 11 1011 1.594353 44.09224 21.32434 11.1561089
Создано в 2020-03-23 пакетом Представить (v0.3.0 )