Самый простой прогноз — предположить, что последовательность букв будет повторяться для каждого id_num
. Я надеюсь, что это соответствует тому, что ОП понимает под предсказанием.
Код
library(data.table)
DT[, .(Events = append(Events, head(rep(Events, 3L), 3L))), by = id_num]
создает
id_num Events
1: 1 A
2: 1 B
3: 1 C
4: 1 D
5: 1 E
6: 1 A
7: 1 B
8: 1 C
9: 2 B
10: 2 E
11: 2 B
12: 2 E
13: 2 B
14: 3 E
15: 3 A
16: 3 E
17: 3 A
18: 3 E
19: 3 A
20: 3 E
21: 4 C
22: 4 C
23: 4 C
24: 4 C
25: 5 F
26: 5 G
27: 5 F
28: 5 G
29: 5 F
id_num Events
data.table
используется здесь из-за простой в использовании функции группировки и потому, что я знаком с ней.
Объяснение
Для каждого id_num
существующая последовательность букв реплицируется 3 раза с использованием rep()
, чтобы обеспечить достаточное количество значений для заполнения как минимум 3 следующих значений. Но только первые 3 значения берутся с использованием head()
. Эти 3 значения добавляются к существующей последовательности для каждого id_num
Немного тюнинга
Возможны две оптимизации:
- Если последовательность значений намного длиннее, чем количество значений для прогнозирования
n_pred
, простое повторение длинной последовательности n_pred
раз будет пустой тратой времени.
- Вызова
append()
можно избежать, если существующая последовательность будет повторяться еще раз.
Итак, оптимизированный код выглядит так:
n_pred <- 3L
DT[, .(Events = head(rep(Events, 1L + ceiling(n_pred / .N)), .N + n_pred)), by = id_num]
Обратите внимание, что .N
— это специальный символ в синтаксисе data.table
, содержащий числовые строки в группе. head()
теперь возвращает исходную последовательность плюс предсказанные значения.
Данные
DT <- data.table(
id_num = c(rep(1L, 5L), 2L, 2L, rep(3L, 4L), 4L, 5L, 5L),
Events = c(LETTERS[1:5], "B", "E", rep(c("E", "A"), 2L), "C", "F", "G")
)
DT
id_num Events
1: 1 A
2: 1 B
3: 1 C
4: 1 D
5: 1 E
6: 2 B
7: 2 E
8: 3 E
9: 3 A
10: 3 E
11: 3 A
12: 4 C
13: 5 F
14: 5 G
22.07.2017