使用 slider_index() 每个索引值有多个观测值时如何避免数据重复?

How to avoid data duplicates when using slider_index() with multiple observations per index value?

我正在使用 slider::slider_index() 在数据集上设置滚动时间 windows。这个想法是将一个函数应用于属于时间 window.

的所有点

这是一个可重现的示例,用于获取属于连续 2 天的所有个体(1 个个体 = 数据框的 1 行)。

# packages
library(dplyr)
library(lubridate)
library(slider)
# dummy data
company <- tibble(
  sales = c(2, 3, 1, 8, 4, 6, 2),
  index = as.Date("2019-08-29") + c(0, 0, 1, 1, 1, 5, 6),
)
# what I have done so far
roll_index <- slide_index(company, company$index, ~ .x, .before = lubridate::days(1))

给出:

> roll_index
[[1]]
# A tibble: 2 x 2
  sales index     
  <dbl> <date>    
1     2 2019-08-29
2     3 2019-08-29

[[2]]
# A tibble: 2 x 2
  sales index     
  <dbl> <date>    
1     2 2019-08-29
2     3 2019-08-29

[[3]]
# A tibble: 5 x 2
  sales index     
  <dbl> <date>    
1     2 2019-08-29
2     3 2019-08-29
3     1 2019-08-30
4     8 2019-08-30
5     4 2019-08-30

[[4]]
# A tibble: 5 x 2
  sales index     
  <dbl> <date>    
1     2 2019-08-29
2     3 2019-08-29
3     1 2019-08-30
4     8 2019-08-30
5     4 2019-08-30

[[5]]
# A tibble: 5 x 2
  sales index     
  <dbl> <date>    
1     2 2019-08-29
2     3 2019-08-29
3     1 2019-08-30
4     8 2019-08-30
5     4 2019-08-30

[[6]]
# A tibble: 1 x 2
  sales index     
  <dbl> <date>    
1     6 2019-09-03

[[7]]
# A tibble: 2 x 2
  sales index     
  <dbl> <date>    
1     6 2019-09-03
2     2 2019-09-04

到目前为止一切顺利。问题是它并不完全符合我的预期。正如您所看到的,一些数据是重复的:roll_index[[3]]roll_index[[4]]roll_index[[5]] 是相同的。 我的理解是 slider::slide_index() 一个接一个地出现,即使多个个体属于相同的索引值。

我如何避免这些数据重复,因为当我使用我的实际数据时,它们往往会增加相当多的输出大小?

您可以使用构成 backbone 幻灯片函数的 slider::hop() 函数集。在您的情况下, hop_index() 可以解决问题。我们只需要手动将 .stop 设置为前一天的 company$index.start 的唯一值。

stops <- unique(company$index)
starts <- stops - lubridate::days(1)

hop_index(
  .x = company,
  .i = company$index,
  .starts = starts,
  .stops = stops,
  .f = ~.x
)
#> [[1]]
#> # A tibble: 2 × 2
#>   sales index     
#>   <dbl> <date>    
#> 1     2 2019-08-29
#> 2     3 2019-08-29
#> 
#> [[2]]
#> # A tibble: 5 × 2
#>   sales index     
#>   <dbl> <date>    
#> 1     2 2019-08-29
#> 2     3 2019-08-29
#> 3     1 2019-08-30
#> 4     8 2019-08-30
#> 5     4 2019-08-30
#> 
#> [[3]]
#> # A tibble: 1 × 2
#>   sales index     
#>   <dbl> <date>    
#> 1     6 2019-09-03
#> 
#> [[4]]
#> # A tibble: 2 × 2
#>   sales index     
#>   <dbl> <date>    
#> 1     6 2019-09-03
#> 2     2 2019-09-04