Для параметра процесса существуют верхний и нижний пределы. Когда данные собираются и сохраняются в векторе, я пытаюсь использовать функцию cut для перекодирования вектора.
Вот как я это сделал (в качестве примера):
x = mtcars$mpg
cut(x, breaks = c(-Inf,20, 30, Inf), labels = c("low","good","high"))
Это прекрасно работает.
Но когда я попытался пометить слишком высокие и слишком низкие значения просто как «сбой», появилось сообщение об ошибке:
x = mtcars$mpg
cut(x, breaks = c(-Inf,20, 30, Inf), labels = c("failure","pass","failure"))
Error in `levels<-`(`*tmp*`, value = if (nl == nL) as.character(labels) else paste0(labels, : factor level [3] is duplicated
Очевидно, что функция cut не ожидает от нас повторяющихся меток.
Есть ли обходной путь для этого?





Начиная с того, как вы работали с cut, вы можете просто перекодировать значения.
x = mtcars$mpg
F1 = cut(x, breaks = c(-Inf,20, 30, Inf), labels = c("low","good","high"))
F2 = factor(ifelse(F1= = "good", "pass", "failure"))
Если вы хотите продолжать использовать cut, один из вариантов — изменить levels после cut.
x1 <- cut(x, breaks = c(-Inf,20, 30, Inf), labels = c("low","good","high"))
levels(x1) <- c("failure","pass","failure")
Однако вместо cut можно использовать простое ifelse
ifelse(x >= 20 & x <= 30, "pass", "failure")
Или просто
c("failure", "pass")[(x >= 20 & x <= 30) + 1]
Или, если нужно проверить несколько условий, мы можем использовать case_when из dplyr, где мы можем добавить условия, если это необходимо.
library(dplyr)
mtcars %>%
mutate(result = case_when(mpg >= 20 & mpg <= 30 ~ "pass",
TRUE ~ "failure"))
Обратите внимание, что начиная с версии R 3.5.0 допускается дублирование меток факторов, поэтому вы не должны сталкиваться с этой проблемой при установке последней версии.