gpt4 book ai didi

r - dplyr:使用滚动时间窗口对数据进行分组和汇总/变异

转载 作者:行者123 更新时间:2023-12-03 16:55:09 27 4
gpt4 key购买 nike

我有代表用户某种交易类型的不规则时间序列数据。每行数据都带有时间戳,表示当时的事务。由于数据的不规则性质,某些用户一天可能有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库,但是 RcppRollzoo中的滚动功能似乎都为常规时间序列设置了更多内容。据我所知,这些窗口函数基于行数而不是指定的时间段工作-关键的区别在于,根据日期和用户,特定时间段的行数可能不同。

例如,对于用户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_by中对 dplyr任意时间段进行编码。另外,如果在没有复杂的 dplyr的情况下,可以通过不同的 group_by方法来实现上述目标,该怎么办?

编辑:更新示例以使滚动窗口的性质更加清晰。

最佳答案

可以使用SQL来完成:

library(sqldf)

dd <- transform(data, date = as.Date(date))
sqldf("select a.*, count(*) n_trans30, sum(b.n_widgets) 'total_widgets30'
from dd a
left join dd b on b.date between a.date - 30 and a.date
and b.id = a.id
and b.rowid <= a.rowid
group by a.rowid")

给予:
  id       date n_widgets n_trans30 total_widgets30
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 2 2015-05-05 5 1 5
6 2 2015-01-01 2 1 2
7 3 2015-08-01 4 1 4
8 4 2015-01-01 5 1 5

关于r - dplyr:使用滚动时间窗口对数据进行分组和汇总/变异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36187931/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com