Каково максимальное монотонное увеличение / уменьшение для каждой группы в моем фрейме данных? - PullRequest
0 голосов
/ 22 января 2019

У меня есть фрейм данных, где у меня есть значения для моей «линейной» переменной и 30 разных групп.Я хочу рассчитать / посчитать максимальное количество раз, когда происходило монотонное увеличение / уменьшение значений для каждой группы в кадре данных.

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

Результаты должны быть

Night 1: Increase 2 Decrease 2
Night 2: Increase 1 Decrease 2

Ответы [ 2 ]

0 голосов
/ 23 января 2019

Другим подходом может быть использование rle для получения максимальных прогонов:

maxmv <- function(x, val) with(rle(x), max(lengths[values == val]))

df %>%
  group_by(Series) %>%
  summarise(increase = maxmv(Basal, "increase"),
            decrease = maxmv(Basal, "decrease"))   

# A tibble: 2 x 3
  Series  increase decrease
  <chr>      <int>    <int>
1 Night 1        2        2
2 Night 2        1        2

Тот же подход с использованием базы r:

aggregate(Basal ~ Series, df, FUN = function(y) c(increase = maxmv(y, "increase"),
                                                  decrease = maxmv(y, "decrease")))

   Series Basal.increase Basal.decrease
1 Night 1              2              2
2 Night 2              1              2
0 голосов
/ 22 января 2019

Вот подход с 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")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...