Я работаю над функцией, которая избавится от выбросов в заданном наборе данных на основе правила 3 сигмы. Мой код представлен ниже. «data» - это набор данных для обработки.Функция: sapply in apply, удаление выбросов
rm.outlier <- function(data){
apply(data, 2, function(var) {
sigma3.plus <- mean(var) + 3 * sd(var)
sigma3.min <- mean(var) - 3 * sd(var)
sapply(var, function(y) {
if (y > sigma3.plus){
y <- sigma3.plus
} else if (y < sigma3.min){
y <- sigma3.min
} else {y <- y}
})
})
as.data.frame(data)
}
Для того, чтобы проверить, если функция работает, я написал короткий тест:
set.seed(123)
a <- data.frame("var1" = rnorm(10000, 0, 1))
b <- a
sum(a$var1 > mean(a$var1) + 3 * sd(a$var1)) # number of outliers in a
В результате, я получаю:
[1] 12
Таким образом, переменная var1 в кадре данных a имеет 12 выбросов. Далее я попытаюсь применить свою функцию на этом объекте:
a2 <- rm.outlier(a)
sum(b$var1 - a2$var1)
К сожалению, это дает 0, что ясно указывает на то, что что-то не работает. Я уже разработал, что реализация sapply верна, поэтому в моем применении должна быть ошибка. Любая помощь будет оценена по достоинству.
Ого, это действительно ускоряли вещи, спасибо большое! – kaksat