首页 > 解决方案 > R中是否有一个函数来定义条件为真的时间段(在时间序列内)

问题描述

我正在寻找条件为真的时间段。我很高兴使用 R 中的任何包来实现这一点,但提供了下面的示例,使用zoo. 我想要做的是找到这个时间序列中的 2 个周期,其中的值大于4.

library(zoo)
#> 
#> Attaching package: 'zoo'
#> The following objects are masked from 'package:base':
#> 
#>     as.Date, as.Date.numeric

# Create an example timeseries
z = zoo(c(1:10, 10:1, 1:10, 10:1), 1:40)
z
#>  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 
#>  1  2  3  4  5  6  7  8  9 10 10  9  8  7  6  5  4  3  2  1  1  2  3  4  5  6 
#> 27 28 29 30 31 32 33 34 35 36 37 38 39 40 
#>  7  8  9 10 10  9  8  7  6  5  4  3  2  1

# See the shape
plot(z)

# Look for timepoints greater than 4
z > 4
#>     1     2     3     4     5     6     7     8     9    10    11    12    13 
#> FALSE FALSE FALSE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE 
#>    14    15    16    17    18    19    20    21    22    23    24    25    26 
#>  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE 
#>    27    28    29    30    31    32    33    34    35    36    37    38    39 
#>  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE 
#>    40 
#> FALSE

# Now I want to define the perilds where the above is true

# Desired result
data.frame(period = 1:2, 
           period_start = c(5, 25), 
           period_end = c(16, 36))
#>   period period_start period_end
#> 1      1            5         16
#> 2      2           25         36

reprex 包(v0.3.0)于 2020-12-01 创建

标签: rzoo

解决方案


这是使用rle.

period_where <- function(x) {
  x <- rle(as.vector(x))
  lens <- x$lengths
  ends <- cumsum(lens)[x$values]
  starts <- ends - lens[x$values] + 1L
  data.frame(
    period = seq_along(starts), 
    period_start = starts, 
    period_end = ends
  )
}

用法

> x <- zoo::zoo(c(1:10, 10:1, 1:10, 10:1), 1:40)
> period_where(x > 4)

  period period_start period_end
1      1            5         16
2      2           25         36

推荐阅读