Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dplyr窗口函数随时间范围而不是行数变化_R_Dplyr_Tidyverse - Fatal编程技术网

Dplyr窗口函数随时间范围而不是行数变化

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

我有一个表格,上面有一个时间列,格式如下:“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

谢谢你的帮助

此处模拟一些数据:

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()
input
SumOverTime
。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