Я пытаюсь вычислить некоторую сводную информацию, чтобы помочь мне проверить выбросы в разных группах в наборе данных.Я могу получить вид вывода, который я хочу, используя dplyr::group_by()
и dplyr::summarise()
- фрейм данных со сводной информацией для каждой группы для данной переменной.Примерно так:
Sepal.Length_outlier_check <- iris %>%
dplyr::group_by(Species) %>%
dplyr::summarise(min = min(Sepal.Length, na.rm = TRUE),
max = max(Sepal.Length, na.rm = TRUE),
median = median(Sepal.Length, na.rm = TRUE),
MAD = mad(Sepal.Length, na.rm = TRUE),
MAD_lowlim = median - (3 * MAD),
MAD_highlim = median + (3 * MAD),
Outliers_low = any(Sepal.Length < MAD_lowlim, na.rm = TRUE),
Outliers_high = any(Sepal.Length > MAD_highlim, na.rm = TRUE)
)
Sepal.Length_outlier_check
Однако я хотел бы иметь возможность поместить это в цикл For, чтобы иметь возможность создавать аналогичные итоговые кадры данных для каждой из различных переменных в наборе данных.Я новичок в использовании циклов, но я подумал, что это может выглядеть примерно так:
vars <- list(colnames(iris))
for (i in vars) {
x <- iris %>%
dplyr::group_by(Species) %>%
dplyr::summarise(min = min(i, na.rm = TRUE),
max = max(i, na.rm = TRUE),
median = median(i, na.rm = TRUE),
MAD = mad(i, na.rm = TRUE),
MAD_lowlim = median - (3 * MAD),
MAD_highlim = median + (3 * MAD),
Outliers_low = any(i < MAD_lowlim, na.rm = TRUE),
Outliers_high = any(i > MAD_highlim, na.rm = TRUE)
)
assign(paste(i, "Outlier_check", sep = "_"), x)
}
Я знаю, что это не сработает, потому что в сводных функциях i
на самом деле нессылаясь на любые данные.Я не уверен, что мне нужно сделать, чтобы это работало!Я был бы очень признателен за вашу помощь, или любые предложения о том, как сделать все это более элегантно.
Я не хочу использовать dplyr :: summarise_all (), потому что он выводит одну сводную таблицу для всехпеременных, и поскольку в реальном наборе данных, над которым я работаю, много переменных, эта сводная таблица станет слишком большой, чтобы ее можно было легко просмотреть.
Спасибо.