Я не совсем уверен в вашем ожидаемом формате вывода, но, возможно, вы можете сделать что-то вроде этого:
library(tidyverse)
df.res <- df %>%
group_by(Series) %>%
mutate(grp = cumsum(c(0, diff(Basal)) != 0)) %>%
add_count(Basal, grp) %>%
group_by(Basal) %>%
filter(n == max(n))
df.res
## A tibble: 8 x 5
## Groups: Basal [2]
# Linear Series Basal grp n
# <int> <fct> <fct> <int> <int>
#1 91 Night 1 decrease 0 2
#2 78 Night 1 decrease 0 2
#3 75 Night 1 decrease 2 2
#4 71 Night 1 decrease 2 2
#5 73 Night 1 increase 3 4
#6 76 Night 1 increase 3 4
#7 103 Night 1 increase 3 4
#8 112 Night 1 increase 3 4
Это вернет data.frame
/ tibble
, с колонкой grp
, отмечающей различные группы увеличения / уменьшения, и n
, возвращающей количество увеличений / уменьшений в этой группе. Затем легко отфильтровать те записи, которые ниже для наибольшей группы увеличения / уменьшения. В случае связей это сообщит обо всех группах, которые имеют одинаковое максимальное увеличение / уменьшение.
В зависимости от того, что вы хотели бы сделать с данными в нисходящем направлении, вы можете, например, разделить df.res
на grp
df.res %>%
split(., .$grp)
#$`0`
## A tibble: 2 x 5
## Groups: Basal [1]
# Linear Series Basal grp n
# <int> <fct> <fct> <int> <int>
#1 91 Night 1 decrease 0 2
#2 78 Night 1 decrease 0 2
#
#$`2`
## A tibble: 2 x 5
## Groups: Basal [1]
# Linear Series Basal grp n
# <int> <fct> <fct> <int> <int>
#1 75 Night 1 decrease 2 2
#2 71 Night 1 decrease 2 2
#
#$`3`
## A tibble: 4 x 5
## Groups: Basal [1]
# Linear Series Basal grp n
# <int> <fct> <fct> <int> <int>
#1 73 Night 1 increase 3 4
#2 76 Night 1 increase 3 4
#3 103 Night 1 increase 3 4
#4 112 Night 1 increase 3 4