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>