r - 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 创建
解决方案
这是使用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
推荐阅读
- java - 休眠:替换对象(OneToOne)
- vue.js - Vue JS将项目推送到数组?
- c++ - 在c ++中将`const`数组的元素设置为另一个数组的长度
- node.js - 如何从 Node Js 中服务器端的 html 字符串中删除所有 JavaScript
- firebase - Firebase OAuth 的回调 URL 不包含项目 ID
- r - 在R中的条件下找到多行的最大值
- spring - 用于非 Spring Boot 项目的 Zipkin 和 Sleuth 集成
- javascript - 如果它在引号内,则附加到数组值中
- arrays - Ruby - 如何按对象数组分组?
- audio-streaming - 使用 Web Audio API 流式传输大型循环音频文件