library(magrittr)
df <- DF[order(DF$Values),]
df$Values %>%
#Find groups for each row
outer(., ., function(x, y) x >= y & x < y + 1) %>%
# Remove sub-groups
`[<-`(apply(., 1, cumsum) > 1, F) %>%
# Remove sub-group columns
.[, colSums(.) > 0] %>%
# select these groups from data
apply(2, function(x) data.frame(ID = paste(df$ID[x], collapse = '/')
, Values = mean(df$Values[x]))) %>%
# bind results by row
do.call(what = rbind)
# ID Values
# 1 a 1.000000
# 2 b/c 2.600000
# 4 d 5.000000
# 5 e/f/g 6.666667
# 8 h 8.500000
# 9 i 10.000000
# 10 j/k 12.600000
# 12 l 14.000000
Примечание:
Этот метод отличается от тех, которые используют diff
, поскольку он группирует строки только в том случае, если все Значения находятся в пределах <1 друг от друга. </p>
Пример:
Измените набор данных так, чтобы Значение было 7,3 при идентификаторе г.
Вышеописанный метод: идентификаторы e, f и g больше не группируются, поскольку значение для идентификатора e равно 6,2 и 7,2 - 6,2> 1.
Метод различий: идентификаторы e, f и g по-прежнему сгруппированы, поскольку разность идентификаторов для e и f составляет <1, а разность идентификаторов F и G составляет <1 </p>