Вот подход с dplyr
. Я уверен, что есть более элегантный способ, но это дает желаемый результат.
Сначала мы отмечаем новые трендовые направления в каждой группе (записывая, если строка Basal
соответствует предыдущей), и берем текущий счет. Это присваивает разные номера каждому новому тренду в группе. Затем мы подсчитываем, сколько записей в каждом тренде, и сохраняем самый длинный.
library(dplyr)
df %>%
group_by(Series) %>%
mutate(new_trend = Basal != lag(Basal, default = ""),
trend_count = cumsum(new_trend)) %>%
count(Series, Basal, trend_count, sort = T) %>%
select(-trend_count) %>%
group_by(Series, Basal) %>%
top_n(1) %>%
spread(Basal, n)
#Selecting by n
## A tibble: 2 x 3
## Groups: Series [2]
# Series decrease increase
# <chr> <int> <int>
#1 Night 1 2 2
#2 Night 2 2 1
Используемые данные:
df <- read.table(header = T, stringsAsFactors = F,
text = "Linear Series Basal
70 'Night 1' increase
72 'Night 1' increase
75 'Night 1' decrease
65 'Night 1' decrease
100 'Night 2' decrease
90 'Night 2' decrease
91 'Night 2' increase
80 'Night 2' decrease")