Цель : заполнить неявные пропущенные значения для каждого идентификатора и каждой группы за весь промежуток времени данных, включая групп, которые полностью отсутствуют из набора данных.
Фон : у каждого идентификатора есть несколько групп, и у каждой группы должны быть значения для каждого дня. Однако в некоторых значениях отсутствуют определенные даты (например, 1b 2019-01-01), а в некоторых группах полностью отсутствует из набора данных (например, 2b).
# A tibble: 8 x 4
ID group date value
<dbl> <chr> <chr> <dbl>
1 1 a 2019-01-01 1
2 1 a 2019-01-02 3
3 1 a 2019-01-03 4
4 1 b 2019-01-02 4
5 1 b 2019-01-03 5
6 2 a 2019-01-01 8
7 2 a 2019-01-02 9
8 2 a 2019-01-03 1
Код для генерации кадра данных
df <- tibble(ID = c(1, 1, 1, 1, 1, 2, 2, 2),
group = c('a', 'a', 'a', 'b', 'b', 'a', 'a', 'a'),
date = c('2019-01-01', '2019-01-02','2019-01-03', '2019-01-02', '2019-01-03', '2019-01-01', '2019-01-02', '2019-01-03'),
value = c(1, 3, 4, 4, 5, 8, 9, 1))
Попытка 1:
library(tsibble)
df %>%
# tsibble format
as_tsibble(key = c(ID, group), index = date) %>%
# group by
group_by(ID, group) %>%
# fill gaps
fill_gaps(.full = TRUE)
Попытка 2:
library(tidyverse)
complete(df, expand(df, nesting(ID, group), date = full_seq(date,1)))
Оба даюттот же результат: обратите внимание, что группа 2b отсутствует
# A tsibble: 9 x 4 [1D]
# Key: ID, group [3]
# Groups: ID, group [3]
ID group date value
<dbl> <chr> <date> <dbl>
1 1 a 2019-01-01 1
2 1 a 2019-01-02 3
3 1 a 2019-01-03 4
4 1 b 2019-01-01 NA
5 1 b 2019-01-02 4
6 1 b 2019-01-03 5
7 2 a 2019-01-01 8
8 2 a 2019-01-02 9
9 2 a 2019-01-03 1
Я ожидаю, что на выходе будет
# A tibble: 12 x 4
ID group date value
<dbl> <chr> <chr> <dbl>
1 1 a 2019-01-01 1
2 1 a 2019-01-02 3
3 1 a 2019-01-03 4
4 1 b 2019-01-01 NA
5 1 b 2019-01-02 4
6 1 b 2019-01-03 5
7 2 a 2019-01-01 8
8 2 a 2019-01-02 9
9 2 a 2019-01-03 1
10 2 b 2019-01-01 NA
11 2 b 2019-01-02 NA
12 2 b 2019-01-03 NA
, где группаb , который неявно пропускает из набора данных, появляется в результате.
Обратите внимание, что мой набор данных содержит восемь миллионов строк и продолжает расти каждый день. Код будет выполняться каждый день, поэтому я с нетерпением жду быстрого запуска 1044 * и удобного способа выполнения задачи. Но любая идея или ответ приветствуется!