Ну, этот ответ приходит довольно поздно. Я не уверен, что вы нашли ответ или нет. Продолжая далее, в отсутствие минимального воспроизводимого примера я попытаюсь ответить на вопрос, используя несколько фиктивных данных и две пользовательские функции. Для данной непрерывной переменной выбросами являются те наблюдения, которые находятся за пределами 1.5*IQR
, где IQR, «интервал между квартилями», представляет собой разницу между 75-м и 25-м квартилями. Я также рекомендую вам увидеть этот пост , содержащий гораздо лучшие решения, чем мой грубый ответ.
> df <- data.frame(X = c(NA, rnorm(1000), runif(20, -20, 20)), Y = c(runif(1000),rnorm(20, 2), NA), Z = c(rnorm(1000, 1), NA, runif(20)))
> head(df)
X Y Z
1 NA 0.8651 0.2784
2 -0.06838 0.4700 2.0483
3 -0.18734 0.9887 1.8353
4 -0.05015 0.7731 2.4464
5 0.25010 0.9941 1.3979
6 -0.26664 0.6778 1.1277
> boxplot(df$Y) # notice the outliers above the top whisker
Теперь я создам пользовательскую функцию для обнаружения выбросов, а другая функция заменит значения выбросов на NA
.
# this function will return the indices of the outlier values
> findOutlier <- function(data, cutoff = 3) {
## Calculate the sd
sds <- apply(data, 2, sd, na.rm = TRUE)
## Identify the cells with value greater than cutoff * sd (column wise)
result <- mapply(function(d, s) {
which(d > cutoff * s)
}, data, sds)
result
}
# check for outliers
> outliers <- findOutlier(df)
# custom function to remove outliers
> removeOutlier <- function(data, outliers) {
result <- mapply(function(d, o) {
res <- d
res[o] <- NA
return(res)
}, data, outliers)
return(as.data.frame(result))
}
> filterData<- removeOutlier(df, outliers)
> boxplot(filterData$Y)