我有一系列 60,000 个数据的数据,其中部分数据如图 1 所示(整个曲线不像这张图片那样漂亮和统一(数据的其他部分是第二张图片))但是有很多循环我的数据中的不同时期。
我需要计算每个周期的三个红色、绿色和紫色矩形的时间(**每个最大和最小之间的时间以及周期的总时间**)
你能给我一些关于如何在 R 中做到这一点的想法......我可以使用任何特殊的命令或包吗?
我有一系列 60,000 个数据的数据,其中部分数据如图 1 所示(整个曲线不像这张图片那样漂亮和统一(数据的其他部分是第二张图片))但是有很多循环我的数据中的不同时期。
我需要计算每个周期的三个红色、绿色和紫色矩形的时间(**每个最大和最小之间的时间以及周期的总时间**)
你能给我一些关于如何在 R 中做到这一点的想法......我可以使用任何特殊的命令或包吗?
前提是mean
数据范围的值用于将数据划分为峰值类别而不是峰值类别。然后生成一个运行 id 来对每组数据进行分组,以便确定一个合适的min
值max
。提供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