행의 양 대신 시간 프레임에 따른 Dplyr 창 함수

Aug 21 2020

다음 형식의 시간 열이있는 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

도와 주셔서 감사합니다!

답변

1 alex_jwb90 Aug 21 2020 at 16:04

여기에서 일부 데이터 시뮬레이션 :

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)
      })
    )
2 Aurèle Aug 21 2020 at 16:26

{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동일한 초 내에 여러 이벤트가 발생하고 문제가 잘못 정의 된 것처럼 보이므로 시간이 지남에 따라 사전 집계 됩니다. 따라서 예상 출력과 다릅니다.