Scope

Classify (in a ‘tidy’ way) a value or an array, applying class limits and labels specified in three equal length arrays: class, cls_min, cls_max.

suppressPackageStartupMessages(library(tidyverse))
## Warning: replacing previous import 'vctrs::data_frame' by 'tibble::data_frame'
## when loading 'dplyr'
# FUNCTION
classify <- function(data, class, cls_min, cls_max) {
  classes <- tibble(class, cls_min, cls_max)
  tst <- classes %>% 
    arrange(cls_min) %>% 
    mutate(prev_max = cls_max %>% lag(1)) %>% 
    filter(cls_min < prev_max)
  if (nrow(tst)) {
    cat("ERROR: Overlapping classes!")
    print(tst)
    return(-1)
  }
  classesl <- classes %>% 
    mutate(lim = cls_min) %>% 
    rbind(classes %>% 
            mutate(class = NA,
                   lim = cls_max)) %>%
    select(-starts_with('z')) %>% 
    arrange(lim)
  return(
    cut(data, 
        breaks = classesl$lim, 
        labels = classesl$class[1:(nrow(classesl)-1)]
        )
  )
}

# TEST
classes0 <- tribble(
  ~ class, ~ z_min, ~ z_max,
      'A',    0.45,    0.55,
      'B',    0.95,    1.05,
      'C',    1.45,    1.55
)
v <- c(0.44, 0.45, 0.46, 0.5, 0.54, 0.55, 0.56)
v <- c(v, v+.5, v+1)
data0 <- tibble( Z = v )

data0 %>% 
  mutate(Zcls = classify(Z , classes0$class, classes0$z_min, classes0$z_max)) %>% 
  print(n=Inf)
## # A tibble: 21 x 2
##        Z Zcls 
##    <dbl> <fct>
##  1  0.44 <NA> 
##  2  0.45 <NA> 
##  3  0.46 A    
##  4  0.5  A    
##  5  0.54 A    
##  6  0.55 A    
##  7  0.56 <NA> 
##  8  0.94 <NA> 
##  9  0.95 <NA> 
## 10  0.96 B    
## 11  1    B    
## 12  1.04 B    
## 13  1.05 B    
## 14  1.06 <NA> 
## 15  1.44 <NA> 
## 16  1.45 <NA> 
## 17  1.46 C    
## 18  1.5  C    
## 19  1.54 C    
## 20  1.55 C    
## 21  1.56 <NA>