R 最大和最小循环之间的时间

R 最大和最小循环之间的时间,r,time-series,cycle,periodicity,R,Time Series,Cycle,Periodicity,我有一系列60000个数据,其中一部分数据如图1所示(整个曲线不像这张图那么漂亮和均匀(另一部分数据如第二张图)),但我的数据中有许多周期,周期不同 我需要为每个周期计算三个红色、绿色和紫色矩形的时间(**每个最大和最小周期之间的时间以及总周期时间**) 你能给我一些关于如何在R。。。是否有任何特殊的命令或包,我可以使用 前提是数据范围的平均值用于将数据划分为峰值类别,而不是峰值类别。然后生成一个运行id,对每组数据进行分组,以便确定适当的min或max值。half_cycle提供了红色和绿色

我有一系列60000个数据,其中一部分数据如图1所示(整个曲线不像这张图那么漂亮和均匀(另一部分数据如第二张图)),但我的数据中有许多周期,周期不同

我需要为每个周期计算三个红色、绿色和紫色矩形的时间(**每个最大和最小周期之间的时间以及总周期时间**)

你能给我一些关于如何在R。。。是否有任何特殊的命令或包,我可以使用


前提是数据范围的
平均值
用于将数据划分为峰值类别,而不是峰值类别。然后生成一个运行id,对每组数据进行分组,以便确定适当的
min
max
值。
half_cycle
提供了红色和绿色框,而
full_cycle
为max-to-max和min-to-min提供了紫色框。可能还有改进的余地,但它提供了一种可以根据需要进行调整的方法

此样本使用随机数据,因为未提供样本数据

set.seed(7)
wave <- c(seq(20, 50, 10), seq(50, 60, 0.5), seq(50, 20, -10))
df1 <- data.frame(time = seq_len(length(wave) * 5),
                  data = as.vector(replicate(5, wave + rnorm(length(wave), sd = 5))))

library(dplyr)
df1 %>%
  mutate(peak = data > mean(range(df1$data))) %>%
  mutate(run = cumsum(peak != lag(peak, default = TRUE))) %>%
  group_by(run) %>%
  mutate(max = max(data), min = min(data)) %>%
  filter((peak == TRUE & data == max) | (peak == FALSE & data == min)) %>%
  mutate(max = if_else(data == max, max, NULL), min = if_else(data == min, min , NULL)) %>%
  ungroup() %>%
  mutate(half_cycle = time - lag(time), full_cycle = time - lag(time, n = 2L))

# A tibble: 11 x 8
    time  data peak    run   max   min half_cycle full_cycle
   <int> <dbl> <lgl> <int> <dbl> <dbl>      <int>      <int>
 1     2  24.0 FALSE     1  NA    24.0         NA         NA
 2    12  67.1 TRUE      2  67.1  NA           10         NA
 3    29  15.1 FALSE     3  NA    15.1         17         27
 4    54  68.5 TRUE      4  68.5  NA           25         42
 5    59  20.8 FALSE     5  NA    20.8          5         30
 6    80  70.6 TRUE      6  70.6  NA           21         26
 7    87  18.3 FALSE     7  NA    18.3          7         28
 8   108  63.1 TRUE      8  63.1  NA           21         28
 9   117  13.8 FALSE     9  NA    13.8          9         30
10   140  64.5 TRUE     10  64.5  NA           23         32
11   145  22.4 FALSE    11  NA    22.4          5         28
set.seed(7)
波平均值(范围(df1$数据))%>%
突变(运行=累计(峰值!=滞后(峰值,默认值=真))%>%
分组依据(运行)%>%
变异(最大值=最大值(数据),最小值=最小值(数据))%>%
过滤器((峰值==真值&数据==最大值)|(峰值==假值&数据==最小值))%>%
变异(max=if-else(数据==max,max,NULL),min=if-else(数据==min,min,NULL))%>%
解组()%>%
突变(半周期=时滞(时间),全周期=时滞(时间,n=2L))
#一个tibble:11x8
时间数据峰值运行最大最小半周全周
1 2 24.0假1不适用24.0不适用
2 12 67.1真实2 67.1 NA 10 NA
3 29 15.1假3 NA 15.1 17 27
4 54 68.5真4 68.5 NA 25 42
55920.8假5NA 20.8530
68070.6真实670.6 NA 21 26
7 87 18.3假7 NA 18.3 7 28
8 108 63.1真实8 63.1 NA 21 28
9 117 13.8假9 NA 13.8 9 30
1014064.5真实1064.5 NA 23 32
11 145 22.4假11 NA 22.4 5 28