我是数据科学的新手,正在研究一个类似于下方展示的示例数据的模型。然而,在原始数据中,有许多id_num
和Events
。我的目标是根据每个id_num
之前的Events
来预测其接下来的3个事件。
请帮助我解决这个问题,或提供使用R编程语言解决此问题的建议方法。
回答:
最简单的“预测”方法是假设每个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 B10: 2 E11: 2 B12: 2 E13: 2 B14: 3 E15: 3 A16: 3 E17: 3 A18: 3 E19: 3 A20: 3 E21: 4 C22: 4 C23: 4 C24: 4 C25: 5 F26: 5 G27: 5 F28: 5 G29: 5 F id_num Events
这里使用data.table
是因为其分组功能易于使用,并且我对它比较熟悉。
解释
对于每个id_num
,使用rep()
复制现有字母序列3次,以确保有足够的值来填充至少接下来的3个值。但只使用head()
取前3个值。这些3个值被追加到每个id_num
的现有序列中。
一些优化
有两种可能的优化方法:
- 如果值的序列远长于要预测的值的数量
n_pred
,简单地重复长序列n_pred
次是浪费的。 - 如果现有序列将被重复一次,则可以避免调用
append()
。
因此,优化的代码如下所示:
n_pred <- 3LDT[, .(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 A10: 3 E11: 3 A12: 4 C13: 5 F14: 5 G