【发布时间】:2023-03-29 16:48:01
【问题描述】:
我有代表用户某种交易类型的不规则时间序列数据。每行数据都带有时间戳,并代表当时的交易。由于数据的不规则性,一些用户一天可能有 100 行,而其他用户一天可能有 0 或 1 笔交易。
数据可能如下所示:
data.frame(
id = c(1, 1, 1, 1, 1, 2, 2, 3, 4),
date = c("2015-01-01",
"2015-01-01",
"2015-01-05",
"2015-01-25",
"2015-02-15",
"2015-05-05",
"2015-01-01",
"2015-08-01",
"2015-01-01"),
n_widgets = c(1,2,3,4,4,5,2,4,5)
)
id date n_widgets
1 1 2015-01-01 1
2 1 2015-01-01 2
3 1 2015-01-05 3
4 1 2015-01-25 4
5 1 2015-02-15 4
6 2 2015-05-05 5
7 2 2015-01-01 2
8 3 2015-08-01 4
9 4 2015-01-01 5
我经常想知道一些关于用户的滚动统计信息。例如:对于这个用户,在某一天,过去 30 天内发生了多少笔交易,过去 30 天内卖出了多少小部件等。
对应上面的例子,数据应该是这样的:
id date n_widgets n_trans_30 total_widgets_30
1 1 2015-01-01 1 1 1
2 1 2015-01-01 2 2 3
3 1 2015-01-05 3 3 6
4 1 2015-01-25 4 4 10
5 1 2015-02-15 4 2 8
6 2 2015-05-05 5 1 5
7 2 2015-01-01 2 1 2
8 3 2015-08-01 4 1 4
9 4 2015-01-01 5 1 5
如果时间窗口是每天,那么解决方法很简单:data %>% group_by(id, date) %>% summarize(...)
类似地,如果时间窗口是每月,这对于 lubridate 来说也相对简单:data %>% group_by(id, year(date), month(date)) %>% summarize(...)
但是我面临的挑战是如何为任意时间段设置时间窗口:5 天、10 天等。
还有RcppRoll 库,但RcppRoll 和zoo 中的滚动函数似乎更适合常规时间序列。据我所知,这些窗口函数是根据行数而不是指定的时间段工作的——关键区别在于,某个时间段可能有不同的行数,具体取决于日期和用户。
例如,对于用户 1,2015-01-01 前 5 天的交易数可能等于 100 次交易,而对于同一用户,2015-02-01 前 5 天的交易数可能是等于 5 笔交易。因此,回顾一组行数根本行不通。
此外,还有另一个 SO 线程讨论不规则时间序列类型数据 (Create new column based on condition that exists within a rolling date) 的滚动日期,但是公认的解决方案是使用 data.table,而我正在专门寻找 dplyr 实现此目的的方法。
我想在这个问题的核心,这个问题可以通过回答这个问题来解决:我如何group_bydplyr 中的任意时间段。或者,如果在没有复杂的group_by 的情况下有不同的dplyr 方式来实现上述目标,我该怎么做?
编辑:更新示例以使滚动窗口的性质更加清晰。
【问题讨论】:
标签: r time-series dplyr lubridate