无论前 n 行是否为 positive/negative 数字,都求最大值?
Find maximum value irrespective of whether is a positive/negative number in the previous nth rows?
嗨,我有一个这样的数据框。
#Data
df2 <- structure(list(Date = structure(c(18502, 18503, 18504, 18505,
18506, 18507, 18508, 18509, 18510, 18511, 18512, 18513, 18514,
18515, 18516, 18517, 18518, 18519, 18520, 18521, 18522, 18523,
18524, 18525, 18526, 18527, 18528, 18529, 18530, 18531, 18532,
18533, 18534, 18535, 18536, 18537, 18538, 18539, 18540), class = "Date"),
Price = c(1490, 3604, 2003, -4004, 4247, -189008, 2506, 4044,
2604, 2204, -4316, 2190, 3137, 2694, 711, 4075, 1315, 454,
1660, 4306, 4032, 3201, 2980, 4474, 3044, 3267, 2573, 2784,
1497, 897, 4342, 4086, 3192, 3634, 380, 2293, 3478, 1190,
1619)), class = "data.frame", row.names = c(NA, -39L))
我想要的是找到绝对值最大值而不仅仅是最大值。例如,如果前第 n 行设置为 4,则第 7 行将为 -189008。我尝试了两个函数,但都没有 return 绝对值的选项。
df2 %>%
mutate(abshigh = slide_dbl(Price, max, .before = 4, .complete = TRUE))
zoo::rollmaxr (df2$Price,k=4,fill=NA)
以上函数输出
Date Price abshigh
1 2020-08-28 1490 NA
2 2020-08-29 3604 NA
3 2020-08-30 2003 NA
4 2020-08-31 -4004 NA
5 2020-09-01 4247 4247
6 2020-09-02 -189008 4247
7 2020-09-03 2506 4247
8 2020-09-04 4044 4247
9 2020-09-05 2604 4247
10 2020-09-06 2204 4044
11 2020-09-07 -4316 4044
12 2020-09-08 2190 4044
13 2020-09-09 3137 3137
14 2020-09-10 2694 3137
15 2020-09-11 711 3137
16 2020-09-12 4075 4075
17 2020-09-13 1315 4075
18 2020-09-14 454 4075
19 2020-09-15 1660 4075
20 2020-09-16 4306 4306
21 2020-09-17 4032 4306
22 2020-09-18 3201 4306
23 2020-09-19 2980 4306
24 2020-09-20 4474 4474
25 2020-09-21 3044 4474
26 2020-09-22 3267 4474
27 2020-09-23 2573 4474
28 2020-09-24 2784 4474
29 2020-09-25 1497 3267
30 2020-09-26 897 3267
31 2020-09-27 4342 4342
32 2020-09-28 4086 4342
33 2020-09-29 3192 4342
34 2020-09-30 3634 4342
35 2020-10-01 380 4342
36 2020-10-02 2293 4086
37 2020-10-03 3478 3634
38 2020-10-04 1190 3634
39 2020-10-05 1619 3478
这是不正确的,因为第七行应该 return -189008 而不是 4247
谢谢。
一个选择是在 abs
olute 'Price' 上获取 slide
max
,然后通过 match
ing 更改 sign
'Price' 的 abs
olute 值(潜在错误警报!)
library(dplyr)
library(slider)
df2 %>%
mutate(abshigh = slide_dbl(abs(Price), max, .before = 4, .complete = TRUE),
abshigh = abshigh * sign(Price[match(abshigh, abs(Price))]))
-输出
Date Price abshigh
1 2020-08-28 1490 NA
2 2020-08-29 3604 NA
3 2020-08-30 2003 NA
4 2020-08-31 -4004 NA
5 2020-09-01 4247 4247
6 2020-09-02 -189008 -189008
7 2020-09-03 2506 -189008
8 2020-09-04 4044 -189008
9 2020-09-05 2604 -189008
10 2020-09-06 2204 -189008
11 2020-09-07 -4316 -4316
12 2020-09-08 2190 -4316
13 2020-09-09 3137 -4316
14 2020-09-10 2694 -4316
15 2020-09-11 711 -4316
16 2020-09-12 4075 4075
17 2020-09-13 1315 4075
18 2020-09-14 454 4075
19 2020-09-15 1660 4075
20 2020-09-16 4306 4306
21 2020-09-17 4032 4306
22 2020-09-18 3201 4306
23 2020-09-19 2980 4306
24 2020-09-20 4474 4474
25 2020-09-21 3044 4474
26 2020-09-22 3267 4474
27 2020-09-23 2573 4474
28 2020-09-24 2784 4474
29 2020-09-25 1497 3267
30 2020-09-26 897 3267
31 2020-09-27 4342 4342
32 2020-09-28 4086 4342
33 2020-09-29 3192 4342
34 2020-09-30 3634 4342
35 2020-10-01 380 4342
36 2020-10-02 2293 4086
37 2020-10-03 3478 3634
38 2020-10-04 1190 3634
39 2020-10-05 1619 3478
或者另一种选择是使用 row_number()
即序列作为 slide_dbl
的输入并根据序列提取 'Price' 的值,得到 max
元素索引使用 which.max
的 abs
olute 值对 'Price' 子集进行子集化(与之前的解决方案相比,这会更正确,因为 match
可能会对 abs
olute 值,如果负元素和正元素都具有相同的值
df2 %>%
mutate(abshigh = slide_dbl(row_number(),
.f = ~ Price[.x][which.max(abs(Price[.x]))], .before = 4, .complete = TRUE))
-输出
Date Price abshigh
1 2020-08-28 1490 NA
2 2020-08-29 3604 NA
3 2020-08-30 2003 NA
4 2020-08-31 -4004 NA
5 2020-09-01 4247 4247
6 2020-09-02 -189008 -189008
7 2020-09-03 2506 -189008
8 2020-09-04 4044 -189008
9 2020-09-05 2604 -189008
10 2020-09-06 2204 -189008
11 2020-09-07 -4316 -4316
12 2020-09-08 2190 -4316
13 2020-09-09 3137 -4316
14 2020-09-10 2694 -4316
15 2020-09-11 711 -4316
16 2020-09-12 4075 4075
17 2020-09-13 1315 4075
18 2020-09-14 454 4075
19 2020-09-15 1660 4075
20 2020-09-16 4306 4306
21 2020-09-17 4032 4306
22 2020-09-18 3201 4306
23 2020-09-19 2980 4306
24 2020-09-20 4474 4474
25 2020-09-21 3044 4474
26 2020-09-22 3267 4474
27 2020-09-23 2573 4474
28 2020-09-24 2784 4474
29 2020-09-25 1497 3267
30 2020-09-26 897 3267
31 2020-09-27 4342 4342
32 2020-09-28 4086 4342
33 2020-09-29 3192 4342
34 2020-09-30 3634 4342
35 2020-10-01 380 4342
36 2020-10-02 2293 4086
37 2020-10-03 3478 3634
38 2020-10-04 1190 3634
39 2020-10-05 1619 3478
嗨,我有一个这样的数据框。
#Data
df2 <- structure(list(Date = structure(c(18502, 18503, 18504, 18505,
18506, 18507, 18508, 18509, 18510, 18511, 18512, 18513, 18514,
18515, 18516, 18517, 18518, 18519, 18520, 18521, 18522, 18523,
18524, 18525, 18526, 18527, 18528, 18529, 18530, 18531, 18532,
18533, 18534, 18535, 18536, 18537, 18538, 18539, 18540), class = "Date"),
Price = c(1490, 3604, 2003, -4004, 4247, -189008, 2506, 4044,
2604, 2204, -4316, 2190, 3137, 2694, 711, 4075, 1315, 454,
1660, 4306, 4032, 3201, 2980, 4474, 3044, 3267, 2573, 2784,
1497, 897, 4342, 4086, 3192, 3634, 380, 2293, 3478, 1190,
1619)), class = "data.frame", row.names = c(NA, -39L))
我想要的是找到绝对值最大值而不仅仅是最大值。例如,如果前第 n 行设置为 4,则第 7 行将为 -189008。我尝试了两个函数,但都没有 return 绝对值的选项。
df2 %>%
mutate(abshigh = slide_dbl(Price, max, .before = 4, .complete = TRUE))
zoo::rollmaxr (df2$Price,k=4,fill=NA)
以上函数输出
Date Price abshigh
1 2020-08-28 1490 NA
2 2020-08-29 3604 NA
3 2020-08-30 2003 NA
4 2020-08-31 -4004 NA
5 2020-09-01 4247 4247
6 2020-09-02 -189008 4247
7 2020-09-03 2506 4247
8 2020-09-04 4044 4247
9 2020-09-05 2604 4247
10 2020-09-06 2204 4044
11 2020-09-07 -4316 4044
12 2020-09-08 2190 4044
13 2020-09-09 3137 3137
14 2020-09-10 2694 3137
15 2020-09-11 711 3137
16 2020-09-12 4075 4075
17 2020-09-13 1315 4075
18 2020-09-14 454 4075
19 2020-09-15 1660 4075
20 2020-09-16 4306 4306
21 2020-09-17 4032 4306
22 2020-09-18 3201 4306
23 2020-09-19 2980 4306
24 2020-09-20 4474 4474
25 2020-09-21 3044 4474
26 2020-09-22 3267 4474
27 2020-09-23 2573 4474
28 2020-09-24 2784 4474
29 2020-09-25 1497 3267
30 2020-09-26 897 3267
31 2020-09-27 4342 4342
32 2020-09-28 4086 4342
33 2020-09-29 3192 4342
34 2020-09-30 3634 4342
35 2020-10-01 380 4342
36 2020-10-02 2293 4086
37 2020-10-03 3478 3634
38 2020-10-04 1190 3634
39 2020-10-05 1619 3478
这是不正确的,因为第七行应该 return -189008 而不是 4247 谢谢。
一个选择是在 abs
olute 'Price' 上获取 slide
max
,然后通过 match
ing 更改 sign
'Price' 的 abs
olute 值(潜在错误警报!)
library(dplyr)
library(slider)
df2 %>%
mutate(abshigh = slide_dbl(abs(Price), max, .before = 4, .complete = TRUE),
abshigh = abshigh * sign(Price[match(abshigh, abs(Price))]))
-输出
Date Price abshigh
1 2020-08-28 1490 NA
2 2020-08-29 3604 NA
3 2020-08-30 2003 NA
4 2020-08-31 -4004 NA
5 2020-09-01 4247 4247
6 2020-09-02 -189008 -189008
7 2020-09-03 2506 -189008
8 2020-09-04 4044 -189008
9 2020-09-05 2604 -189008
10 2020-09-06 2204 -189008
11 2020-09-07 -4316 -4316
12 2020-09-08 2190 -4316
13 2020-09-09 3137 -4316
14 2020-09-10 2694 -4316
15 2020-09-11 711 -4316
16 2020-09-12 4075 4075
17 2020-09-13 1315 4075
18 2020-09-14 454 4075
19 2020-09-15 1660 4075
20 2020-09-16 4306 4306
21 2020-09-17 4032 4306
22 2020-09-18 3201 4306
23 2020-09-19 2980 4306
24 2020-09-20 4474 4474
25 2020-09-21 3044 4474
26 2020-09-22 3267 4474
27 2020-09-23 2573 4474
28 2020-09-24 2784 4474
29 2020-09-25 1497 3267
30 2020-09-26 897 3267
31 2020-09-27 4342 4342
32 2020-09-28 4086 4342
33 2020-09-29 3192 4342
34 2020-09-30 3634 4342
35 2020-10-01 380 4342
36 2020-10-02 2293 4086
37 2020-10-03 3478 3634
38 2020-10-04 1190 3634
39 2020-10-05 1619 3478
或者另一种选择是使用 row_number()
即序列作为 slide_dbl
的输入并根据序列提取 'Price' 的值,得到 max
元素索引使用 which.max
的 abs
olute 值对 'Price' 子集进行子集化(与之前的解决方案相比,这会更正确,因为 match
可能会对 abs
olute 值,如果负元素和正元素都具有相同的值
df2 %>%
mutate(abshigh = slide_dbl(row_number(),
.f = ~ Price[.x][which.max(abs(Price[.x]))], .before = 4, .complete = TRUE))
-输出
Date Price abshigh
1 2020-08-28 1490 NA
2 2020-08-29 3604 NA
3 2020-08-30 2003 NA
4 2020-08-31 -4004 NA
5 2020-09-01 4247 4247
6 2020-09-02 -189008 -189008
7 2020-09-03 2506 -189008
8 2020-09-04 4044 -189008
9 2020-09-05 2604 -189008
10 2020-09-06 2204 -189008
11 2020-09-07 -4316 -4316
12 2020-09-08 2190 -4316
13 2020-09-09 3137 -4316
14 2020-09-10 2694 -4316
15 2020-09-11 711 -4316
16 2020-09-12 4075 4075
17 2020-09-13 1315 4075
18 2020-09-14 454 4075
19 2020-09-15 1660 4075
20 2020-09-16 4306 4306
21 2020-09-17 4032 4306
22 2020-09-18 3201 4306
23 2020-09-19 2980 4306
24 2020-09-20 4474 4474
25 2020-09-21 3044 4474
26 2020-09-22 3267 4474
27 2020-09-23 2573 4474
28 2020-09-24 2784 4474
29 2020-09-25 1497 3267
30 2020-09-26 897 3267
31 2020-09-27 4342 4342
32 2020-09-28 4086 4342
33 2020-09-29 3192 4342
34 2020-09-30 3634 4342
35 2020-10-01 380 4342
36 2020-10-02 2293 4086
37 2020-10-03 3478 3634
38 2020-10-04 1190 3634
39 2020-10-05 1619 3478