1

我有一系列 60,000 个数据的数据,其中部分数据如图 1 所示(整个曲线不像这张图片那样漂亮和统一(数据的其他部分是第二张图片))但是有很多循环我的数据中的不同时期。

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

你能给我一些关于如何在 R 中做到这一点的想法......我可以使用任何特殊的命令或包吗?

在此处输入图像描述

在此处输入图像描述

4

1 回答 1

0

前提是mean数据范围的值用于将数据划分为峰值类别而不是峰值类别。然后生成一个运行 id 来对每组数据进行分组,以便确定一个合适的minmax。提供half_cycle红色和绿色框,同时full_cycle提供最大到最大和最小到最小的紫色框。可能有改进的余地,但它提供了一种可以根据需要进行调整的方法。

该样本使用随机数据,因为没有提供样本数据。

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
于 2020-11-25T20:21:00.737 回答