用于标记超出公差的参数值的剪切功能

时间:2019-04-29 01:30:08

标签: r cut

对于过程参数,有上限和下限。收集数据并将其存储在矢量中后,我尝试使用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 个答案:

答案 0 :(得分:1)

如果您想继续使用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"))

答案 1 :(得分:0)

从使用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"))