Как найти среднее из n последовательных дней в каждой группе r - PullRequest
0 голосов
/ 21 октября 2018

У меня есть фрейм данных, который содержит идентификатор (содержит дубликат), дату (содержит дубликат), значение.значения записываются для разных дней подряд.Теперь я хочу сгруппировать фрейм данных с идентификатором и датой (как n последовательных дней) и найти среднее значение.и вернуть NA, если последняя группа не содержит n дней.

id  date          value
 1  2016-10-5       2
 1  2016-10-6       3
 1  2016-10-7       1
 1  2016-10-8       2
 1  2016-10-9       5
 2  2013-10-6       2
 .  .               .
 .  .               .
 .  .               .
 20 2012-2-6        10

желаемый результат с n-последовательными днями как 3

  id  date      value  group_n_consecutive_days     mean_n_consecutive_days
   1  2016-10-5  2         1                        2
   1  2016-10-6  3         1                        2
   1  2016-10-7  1         1                        2
   1  2016-10-8  2         2                        NA
   1  2016-10-9  5         2                        NA
   2  2013-10-6  2         1                        4
   .
   .
   .
   .
    20 2012-2-6  10         6                       25         

1 Ответ

0 голосов
/ 21 октября 2018

Данные в вопросе отсортированы и последовательно в id, поэтому мы предполагаем, что это так.Также, когда вопрос касается дублирующих дат, мы предполагаем, что это означает, что разные значения идентификатора могут иметь одинаковую дату, но внутри идентификатора даты являются уникальными и последовательными.Теперь, используя данные, воспроизводимые в примечании 2 в конечной группе с помощью id, вычислите номера групп с помощью gl.Затем при группировке по id и group_no берется среднее значение каждой группы из 3 или NA для небольших групп.

library(dplyr)

DF %>% 
  group_by(id) %>%
  mutate(group_no = c(gl(n(), 3, n()))) %>%
  group_by(group_no, add = TRUE) %>%
  mutate(mean = if (n() == 3) mean(value) else NA) %>%
  ungroup

, что дает:

# A tibble: 6 x 5
     id date       value group_no  mean
  <int> <date>     <int>    <int> <dbl>
1     1 2016-10-05     2        1     2
2     1 2016-10-06     3        1     2
3     1 2016-10-07     1        1     2
4     1 2016-10-08     2        2    NA
5     1 2016-10-09     5        2    NA
6     2 2013-10-06     2        1    NA

Примечание 1

Альтернативой gl(...) может быть cumsum(rep(1:3, length = n()) == 1), а if (n() = 3) mean(value) else NA может быть mean(head(c(value, NA, NA), 3)).

Примечание 2

Предполагалось, что входные данные в воспроизводимом виде:

Lines <- "id  date          value
 1  2016-10-5       2
 1  2016-10-6       3
 1  2016-10-7       1
 1  2016-10-8       2
 1  2016-10-9       5
 2  2013-10-6       2"
DF <- read.table(text = Lines, header = TRUE)
DF$date <- as.Date(DF$date)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...