【问题标题】:How to avoid data duplicates when using slider_index() with multiple observations per index value?使用每个索引值具有多个观察值的 slider_index() 时如何避免数据重复?
【发布时间】:2022-01-06 14:28:17
【问题描述】:

我正在使用slider::slider_index() 在数据集上设置滚动时间窗口。这个想法是对属于时间窗口的所有点应用一个函数。

这是一个可重复的示例,用于获取属于连续 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() 一个接一个地出现,即使多个人属于同一个索引值。

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

【问题讨论】:

    标签: r time


    【解决方案1】:

    您可以使用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
    

    【讨论】:

    • 非常感谢!在寻找答案时,我完全错过了slider::hop() 函数系列......我想我需要睁开眼睛;)
    猜你喜欢
    • 1970-01-01
    • 2020-09-05
    • 1970-01-01
    • 1970-01-01
    • 2020-04-04
    • 1970-01-01
    • 1970-01-01
    • 2019-02-19
    • 1970-01-01
    相关资源
    最近更新 更多