Почему этот код работает? [R] [dplyr] [мутировать]

#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. Спасибо! Теперь я понимаю.