Данные в вопросе отсортированы и последовательно в 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)