r-Dplyr窗口函数随时间的变化而不是行的数量



我有一个R tibble,它有一个时间列,格式如下:"2020-08-19 07:59:05 IDT";我想创建一个额外的列,使一些聚合功能,但在时间框架的范围内,例如,我有一个额外列Amount,我想创建另一个列,为每行加上前10秒的所有金额。

Time          Amount.  SumOverTime(10 sec)
1   2020-08-19 07:57:18             0.  0
2   2020-08-19 07:57:19             1.  1
3   2020-08-19 07:57:19             1.  2
4   2020-08-19 07:57:20             0.  2
5   2020-08-19 07:57:20             2.  4
6   2020-08-19 07:57:20             0.  4
7   2020-08-19 07:57:21             0.  4
8   2020-08-19 07:57:22             0.  4
9   2020-08-19 07:57:23             1.  5
10  2020-08-19 07:57:28             0.  5
11  2020-08-19 07:57:30             0.  3
12  2020-08-19 07:57:31             0.  1
13  2020-08-19 07:57:32             0.  1

谢谢你的帮助!

使用{slider}

library(dplyr)
library(slider)
df %>% 
count(Time, wt = Amount, name = "Amount") %>% 
mutate(SumOverTime = slide_period_dbl(.x = df$Amount, .i = df$Time, 
.period = "second", .before = 10,
.f = sum, 
.complete = FALSE))
#>                   Time Amount SumOverTime
#> 1  2020-08-19 07:57:18      0           0
#> 2  2020-08-19 07:57:19      2           2
#> 3  2020-08-19 07:57:20      2           4
#> 4  2020-08-19 07:57:21      0           4
#> 5  2020-08-19 07:57:22      0           4
#> 6  2020-08-19 07:57:23      1           5
#> 7  2020-08-19 07:57:28      0           5
#> 8  2020-08-19 07:57:30      0           3
#> 9  2020-08-19 07:57:31      0           1
#> 10 2020-08-19 07:57:32      0           1

请注意,我们使用count随着时间的推移进行预聚合,因为在同一秒内发生了多个事件,而在其他方面,问题似乎定义不清,因此这与预期的输出不同。

此处模拟一些数据:

library(dplyr)
library(purrr)
df <- tibble(
time = seq(lubridate::now()-10, lubridate::now(), length.out = 100) + runif(100,-10,10),
Amount = runif(100, 0, 5)
) %>%
arrange(time)

然后,您可以使用purrr:map并提供完整的df作为额外的参数。这使您可以轻松地对其进行筛选,并提取Amount列的和。可能不是超级性能,但它能完成任务:(

df.2 <- df %>%
mutate(
SumOverTime = map_dbl(time, ., .f = ~{
.y %>% filter(time >= .x-10, time <=.x) %>% pull(Amount) %>% sum(na.rm=T)
})
)

最新更新