У меня есть большой набор данных с более чем 2000 наблюдениями. Эти данные включают концентрацию токсинов в тканях животных. Моя переменная ответа - myRESULT, и у меня есть несколько наблюдений для каждого интересующего ANALYTE. Мне нужно удалить выбросы, определяемые числами, отстоящими от среднего более чем на три SD, из каждой группы ANALYTE.
Хотя я понимаю, что обычно мне не следует удалять выбросы из набора данных, я все же хотел бы знать, как это сделать в R.
Вот небольшая часть того, как выглядят мои данные:

Я задал похожий вопрос здесь: stackoverflow.com/questions/51230775/…





Это подмножество по группам, которое можно сделать по-разному. С dplyr вы используете group_by для установки группировки, затем filter для подмножества строк, передавая ему выражение, которое будет вычислять возврат TRUE для строк, которые нужно сохранить, и FALSE для выбросов.
Например, используя iris и 2 стандартных отклонения (все в пределах 3):
library(dplyr)
iris_clean <- iris %>%
group_by(Species) %>%
filter(abs(Petal.Length - mean(Petal.Length)) < 2*sd(Petal.Length))
iris_clean %>% count()
#> # A tibble: 3 x 2
#> # Groups: Species [3]
#> Species n
#> <fct> <int>
#> 1 setosa 46
#> 2 versicolor 47
#> 3 virginica 47
Используя подход разделения-применения-комбинирования в базе R,
do.call(rbind, lapply(
split(iris, iris$Species),
function(x) x[abs(x$Petal.Length - mean(x$Petal.Length)) < 2*sd(x$Petal.Length), ]
))
Я удалил свой ответ (слишком похожий на ваш), но вы можете включить scale (т.е. filter(abs(scale(Petal.Length))<2) для компактности, если хотите
Это умно! Я перестал использовать scale, если я уже не работаю с матрицами, но здесь он краткий.
Думаю, я нашел проблему. У меня много аналитов с SD, равным 0, могу ли я как-нибудь удержать R от исключения их из классификации как выбросы?
Вы можете использовать ifelse или case_when в filter, например filter(ifelse(sd(Petal.Length) == 0, TRUE, abs(Petal.Length - mean(Petal.Length)) < 2*sd(Petal.Length)). Или вы можете захотеть вырезать только для групп с определенным количеством наблюдений (n()) или уникальными значениями (n_distinct).
Воспроизводимый пример, пожалуйста. У нас нет времени вручную вводить ваши числа в консоль R.