функция обрезки для маркировки значений параметров вне допуска - PullRequest
0 голосов
/ 29 апреля 2019

Для параметра процесса существуют верхний и нижний пределы. Когда данные собираются и сохраняются в векторе, я пытаюсь использовать функцию 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 не предполагает, что мы будем предоставлять повторяющиеся метки.

Есть ли обходной путь для этого?

Ответы [ 2 ]

1 голос
/ 29 апреля 2019

Если вы хотите продолжить использовать 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"))
0 голосов
/ 29 апреля 2019

Начиная с того, как вы работали с 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"))
...