我有一个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)
})
)