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