Мы можем создать условие с помощью max/min
library(dplyr)
df1 %>%
group_by(ID) %>%
mutate(state = case_when(dist == max(dist) ~ "high",
dist == min(dist) ~ "low",
TRUE ~ NA_character_))
Поскольку для каждого идентификатора есть два значения, второе условие не требуется
df1 %>%
group_by(ID) %>%
mutate(state = case_when(dist == max(dist) ~ "high",
TRUE ~"low"))
data
df1 <- structure(list(ID = c(1L, 1L, 2L, 2L, 3L, 3L), dist = c(23L,
10L, 12L, 20L, 14L, 33L)), class = "data.frame", row.names = c(NA,
-6L))