Извлечение элементов самых больших монотонно увеличивающихся / убывающих последовательностей в кадре данных - PullRequest
0 голосов
/ 25 января 2019

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

Linear | Series | Basal
91 | Night 1 | decrease       
78 | Night 1 | decrease
82 | Night 1 | increase
75 | Night 1 | decrease
71 | Night 1 | decrease
73 | Night 1 | increase
76 | Night 1 | increase
103 | Night 1 | increase
112 | Night 1 | increase
.
.
.

Группа (столбец: Серия) Результаты / выходные данные должны быть там, где я хочу сохранить два векторакак это:

Night 1: night1_inc <- c(73,76,102,112)
Night 1: night1_dec <- c(91,78)

1 Ответ

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

Я не совсем уверен в вашем ожидаемом формате вывода, но, возможно, вы можете сделать что-то вроде этого:

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