#r #dplyr
#r #dplyr
Вопрос:
У меня есть числовая переменная (FinalPerformance), которая принимает значение от 0 до 100. Я хочу создать уровни факторов для этой переменной. Итак, я использую функцию quantile для разделения набора данных на три части. Моя проблема в том, что код сортирует столбец правильно (я думаю), но я не уверен, почему. Смотрите ниже:
Performance <- Performance %>% mutate(FactorPerformance = as.factor(case_when(
FinalPerformance <= quantile(FinalPerformance, probs = seq(0,1,1/3))[[1]] ~ "Low",
FinalPerformance <= quantile(FinalPerformance, probs = seq(0,1,1/3))[[2]] ~ "Medium",
TRUE ~ "High"
)), FactorPerformance = fct_relevel(FactorPerformance, c("Low", "Medium", "High")))
Я придерживаюсь мнения, что «Средний» уровень фактора должен перезаписывать «Низкий» уровень фактора, потому что я не указываю диапазон между. Смотрите ниже:
Performance <- Performance %>% mutate(FactorPerformance = as.factor(case_when(
FinalPerformance <= quantile(FinalPerformance, probs = seq(0,1,1/3))[[1]] ~ "Low",
FinalPerformance > quantile(FinalPerformance, probs = seq(0,1,1/3))[[1]] amp;
FinalPerformance <= quantile(FinalPerformance, probs = seq(0,1,1/3))[[2]] ~ "Medium",
TRUE ~ "High"
)), FactorPerformance = fct_relevel(FactorPerformance, c("Low", "Medium", "High")))
Я получаю тот же результат, когда считаю значения в столбце FactorPerformance . Чего мне не хватает?
Ответ №1:
Это действительно сводится к тому, как dplyr::case_when()
работает:
mutate()
применяется case_when()
к каждой строке data.frame. Для каждой строки он проверяет условные операторы в case_when()
вызове. Он начинается сверху, чтобы найти условие, которое оценивается TRUE
как . Как только один найден, возвращается значение справа от тильды, все дальнейшие условия игнорируются, и интерпретатор переходит к следующей строке.
Что касается вашего кода: если вы хотите, чтобы категоризация как «средний» предшествовала «низкому», вы должны указать условие «средний» перед условием «низкий».
В качестве общего объяснения: ниже приведен упрощенный пример. Все три оператора работают TRUE
, но поскольку строка 10 %in% 5:10 ~ "foo"
предшествует другому условному оператору, это возвращает «foo».
dplyr::case_when(
10 %in% 5:10 ~ "foo",
10 %in% 1:10 ~ "bar",
TRUE ~ NA_character_
)
Здесь два условных оператора переворачиваются, и на выходе получается «bar».
dplyr::case_when(
10 %in% 1:10 ~ "bar",
10 %in% 5:10 ~ "foo",
TRUE ~ NA_character_
)
Это также причина TRUE ~ NA_character_
, по которой работает как catch all для всего, что не захвачено ни одним из предыдущих операторов.
Комментарии:
1. Итак, вы хотите сказать, что если я упорядочу (x) свой код для квантиля и сначала укажу нижний квантиль, у меня не будет проблем с кодом?
2. Нет,
arrange()
не влияет на вывод. Я уточнил свой ответ и добавил примеры кода.3. Спасибо! Теперь я понимаю.