如何解决时间范围内的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
请注意,由于多个事件在同一秒内发生,因此我们会随着时间{@ {1}}进行预汇总,否则该问题似乎定义不明确,因此与预期的输出有所不同。
,在此处模拟一些数据:
library(dplyr)
library(purrr)
df <- tibble(
time = seq(lubridate::now()-10,lubridate::now(),length.out = 100) + runif(100,-10,10),Amount = runif(100,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)
})
)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。