无论前 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 谢谢。

一个选择是在 absolute 'Price' 上获取 slide max,然后通过 matching 更改 sign 'Price' 的 absolute 值(潜在错误警报!)

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.maxabsolute 值对 'Price' 子集进行子集化(与之前的解决方案相比,这会更正确,因为 match 可能会对 absolute 值,如果负元素和正元素都具有相同的值

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