我已经创建了一个简化版的数据:
我希望对原始数据框
期望的输出如下:
a <- data.frame(a = c(0,1,2,3,2,1,0,-1,-2,-3,-2,-1,
0,1,2,3,4,3,2,1,0,-1,-2,-3,-2,-1,
0,1,2,1,0,-1,-2,-3,-2,-1,0,1,2,3,2,1,
0,-1,-2,-3,-2,-1,0,1,2,3,2,1,
0,-1,-2,-3,-4,-3,-2,-1,0))
a$b <- seq(1,length(a$a),1)
我试图检测数据中的循环,具体方法如下(欢迎更好的建议):
library(quantmod)
max <- findPeaks(a$a)
min <- findValleys(a$a)
这实际上是在最大值和最小值之后得到的点。我想找到每个周期的跨度和设置点。
周期: - 第一个周期定义为第一个设定点之前的第一个数据点。例如,考虑第一个设定点为-1.0,第一个周期在行1到12定义。选择行12作为周期的结束,因为它出现在第一个峰谷之后,而且也小于或等于-1.0。第二个周期从第13行开始,到第27行结束,因为第27行的幅度为0,小于或等于0.5,并且出现在第二个峰谷点之后。:
span <- a[max-1,]$a-a[min-1,]$a
set <- a[max,]$a - span/2
我希望对原始数据框
a
进行分组,并将每个周期(组)的循环号、跨度和设定点分配给相应的行组。期望的输出如下:
> print(a)
a b cycles span set
1 0 1 1 6 -1.0
2 1 2 1 6 -1.0
3 2 3 1 6 -1.0
4 3 4 1 6 -1.0
5 2 5 1 6 -1.0
6 1 6 1 6 -1.0
7 0 7 1 6 -1.0
8 -1 8 1 6 -1.0
9 -2 9 1 6 -1.0
10 -3 10 1 6 -1.0
11 -2 11 1 6 -1.0
12 -1 12 1 6 -1.0
13 0 13 2 7 0.5
14 1 14 2 7 0.5
15 2 15 2 7 0.5
16 3 16 2 7 0.5
17 4 17 2 7 0.5
18 3 18 2 7 0.5
19 2 19 2 7 0.5
20 1 20 2 7 0.5
21 0 21 2 7 0.5
22 -1 22 2 7 0.5
23 -2 23 2 7 0.5
24 -3 24 2 7 0.5
25 -2 25 2 7 0.5
26 -1 26 2 7 0.5
27 0 27 2 7 0.5
28 1 28 3 5 -1.5
29 2 29 3 5 -1.5
30 1 30 3 5 -1.5
31 0 31 3 5 -1.5
32 -1 32 3 5 -1.5
33 -2 33 3 5 -1.5
34 -3 34 3 5 -1.5
35 -2 35 3 5 -1.5
36 -1 36 4 6 -1.0
37 0 37 4 6 -1.0
38 1 38 4 6 -1.0
39 2 39 4 6 -1.0
40 3 40 4 6 -1.0
41 2 41 4 6 -1.0
42 1 42 4 6 -1.0
43 0 43 4 6 -1.0
44 -1 44 4 6 -1.0
45 -2 45 4 6 -1.0
46 -3 46 4 6 -1.0
47 -2 47 4 6 -1.0
48 -1 48 4 6 -1.0
49 0 49 5 7 -1.5
50 1 50 5 7 -1.5
51 2 51 5 7 -1.5
52 3 52 5 7 -1.5
53 2 53 5 7 -1.5
54 1 54 5 7 -1.5
55 0 55 5 7 -1.5
56 -1 56 5 7 -1.5
57 -2 57 5 7 -1.5
58 -3 58 5 7 -1.5
59 -4 59 5 7 -1.5
60 -3 60 5 7 -1.5
61 -2 61 5 7 -1.5
62 -1 62 5 7 -1.5
63 0 63 5 7 -1.5
span
和set
的逻辑是什么?第一个值如何获得行1-12,第二个值获得13-27等等? - Ronak Shahspan
给出了每个周期的范围,因此我在每个周期中获取最大值和平均值以找到其范围。set
是周期振荡的点,因此如果它完全对称,则应为零,但由于我的数据不对称,我将每个周期的最大值减去其跨度的一半。 - Maral Dorri