Dplyr窗口函数随时间范围而不是行数变化
我有一个表格,上面有一个时间列,格式如下:“2020-08-19 07:59:05 IDT” 我想创建一个额外的列,该列具有某种聚合功能,但在时间范围内,例如,我有一个额外的列Amount,我想创建一个额外的列,该列对每行求和前10秒的所有金额Dplyr窗口函数随时间范围而不是行数变化,r,dplyr,tidyverse,R,Dplyr,Tidyverse,我有一个表格,上面有一个时间列,格式如下:“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
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
谢谢你的帮助 此处模拟一些数据:
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)
使用
{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
对时间进行预聚合,否则问题似乎定义不清,因此这与预期的输出不同。谢谢!处理整个文档需要花费很多时间,但它是有效的。是的,我相信从性能角度来看,Aurèle提出的非幼稚解决方案会更好。但是很高兴听到它能帮你找到你需要的地方:)目前,我在奥雷尔的解决方案中遇到了以下错误:错误:mutate()
inputSumOverTime
。x.i
必须按升序排列。ℹ 它不在位置533521处上升。ℹ 输入sumtowernate
是slide\u period\u dbl(…)
。您是否尝试通过在计数行和突变行之间显式插入arrange(Time)%%>%
来抵消此问题?我得到以下错误:错误:mutate()
输入sumtowernate
。x.i
必须按升序排列。ℹ 它不在位置533521处上升。ℹ 输入SumOverTime
是slide\u period\u dbl(…)
。
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