从R中的一组局部极大值中得到实极大值

从R中的一组局部极大值中得到实极大值,r,loops,subset,R,Loops,Subset,我在早些时候发布了这篇文章,但我想我对我的问题不是很清楚,所以我正在更新它,包括我取得的进展 我有一个数据,其中我获得了由我的loc_max列中的TRUE值指定的局部最大值。我想根据以下条件从这些局部极大值中确定我的“真极大值”:1)局部极大值之前的5个值必须至少有3个正一阶导数;和2.)随后的5个值必须至少有3个负一阶导数。以下是我的示例数据框: val <- c(0.06796823, 0.12165540, 0.17685980, 0.28518490, 0.36616820,

我在早些时候发布了这篇文章,但我想我对我的问题不是很清楚,所以我正在更新它,包括我取得的进展

我有一个数据,其中我获得了由我的
loc_max
列中的
TRUE
值指定的局部最大值。我想根据以下条件从这些局部极大值中确定我的“真极大值”:1)局部极大值之前的5个值必须至少有3个正一阶导数;和2.)随后的5个值必须至少有3个负一阶导数。以下是我的示例数据框:

val <- c(0.06796823, 0.12165540, 0.17685980, 0.28518490, 0.36616820,
        0.40935790, 0.45418170, 0.48220730, 0.45214280, 0.40290130,
        0.38103100, 0.39525690, 0.40527800, 0.48172680, 0.54250300,
        0.56136270, 0.53755350, 0.57047540, 0.55738850, 0.50470080,
        0.47487730, 0.45653140, 0.45670750, 0.43722310, 0.42154800,
        0.41154490, 0.38138090, 0.41802160, 0.42043370, 0.39982040,
        0.35258890, 0.32990900, 0.28508770, 0.23949280, 0.19405640,
        0.16321880, 0.17098540, 0.17572110, 0.17464730, 0.17670690,
        0.16105620, 0.18609890, 0.19083090, 0.19506300, 0.16865580,
        0.15830920)
loc_max <- c(FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, 
             FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, TRUE, 
             FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, 
             FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
             FALSE,  TRUE, FALSE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, 
             FALSE)

我仍然对循环感到困惑,非常感谢您的帮助。谢谢

所以,我没有完全按照你的解释,而是集中在你提到的两个条件上

library(dplyr)
library(zoo)

df %>%
    mutate(first_diff = val - lag(val)) %>%
    mutate(preceeding5 = rollsum(lag(first_diff > 0), 5, fill = NA, align = "right")) %>%
    mutate(succeeding5 = rollsum(lead(first_diff < 0), 5, fill = NA, align = "left")) %>%
    mutate(true_max = loc_max &
                      preceeding5 >= 3 &
                      succeeding5 >= 3) %>%
    mutate(true_max = if_else(true_max, TRUE, NA))

如果你错了,或者是我错了,你可以检查一下吗?

我想你需要一个额外的标准,当前值高于周围的10个值,并且当前值必须大于或等于cummax@chinsoon12如果我们要添加这些条件,Georgery的代码应该有什么改进?对不起,我以为你仍然在寻找与上一个问题相同的输出。@chinsoon12你问了一个非常好的问题,这让我重新思考了我的条件。我不希望峰值彼此太接近(即相距5个指数以内),加上这个条件是有意义的。嗨,是的,我在指数16上犯了一个错误。我的身体状况有一个漏洞,我现在发现了。但你的解决方案正是我想要执行的!谢谢(更正我的原始帖子的预期输出)
locmax_ind <- c(which(df2$loc_max == "TRUE"))
ifelse(sum(df2$first_diff[(locmax_ind - 5):(locmax_ind - 1)] > 0) >= 3 &
       sum(df2$first_diff[((locmax_ind + 1):(locmax_ind + 5))] < 0) >= 3, TRUE, NA)
          val loc_max  first_diff true_max
1  0.06796823   FALSE          NA NA
2  0.12165540   FALSE  0.05368717 NA
3  0.17685980   FALSE  0.05520440 NA
4  0.28518490   FALSE  0.10832510 NA
5  0.36616820   FALSE  0.08098330 NA
6  0.40935790   FALSE  0.04318970 NA
7  0.45418170   FALSE  0.04482380 NA
8  0.48220730    TRUE  0.02802560 TRUE
9  0.45214280   FALSE -0.03006450 NA
10 0.40290130   FALSE -0.04924150 NA
11 0.38103100   FALSE -0.02187030 NA
12 0.39525690   FALSE  0.01422590 NA
13 0.40527800   FALSE  0.01002110 NA
14 0.48172680   FALSE  0.07644880 NA
15 0.54250300   FALSE  0.06077620 NA
16 0.56136270    TRUE  0.01885970 TRUE
17 0.53755350   FALSE -0.02380920 NA
18 0.57047540    TRUE  0.03292190 TRUE
19 0.55738850   FALSE -0.01308690 NA
20 0.50470080   FALSE -0.05268770 NA
21 0.47487730   FALSE -0.02982350 NA
22 0.45653140   FALSE -0.01834590 NA
23 0.45670750    TRUE  0.00017610 NA
24 0.43722310   FALSE -0.01948440 NA
25 0.42154800   FALSE -0.01567510 NA
26 0.41154490   FALSE -0.01000310 NA
27 0.38138090   FALSE -0.03016400 NA
28 0.41802160   FALSE  0.03664070 NA
29 0.42043370    TRUE  0.00241210 NA
30 0.39982040   FALSE -0.02061330 NA
31 0.35258890   FALSE -0.04723150 NA
32 0.32990900   FALSE -0.02267990 NA
33 0.28508770   FALSE -0.04482130 NA
34 0.23949280   FALSE -0.04559490 NA
35 0.19405640   FALSE -0.04543640 NA
36 0.16321880   FALSE -0.03083760 NA
37 0.17098540   FALSE  0.00776660 NA
38 0.17572110    TRUE  0.00473570 NA
39 0.17464730   FALSE -0.00107380 NA
40 0.17670690    TRUE  0.00205960 NA
41 0.16105620   FALSE -0.01565070 NA
42 0.18609890   FALSE  0.02504270 NA
43 0.19083090   FALSE  0.00473200 NA
44 0.19506300    TRUE  0.00423210 NA
45 0.16865580   FALSE -0.02640720 NA
46 0.15830920   FALSE -0.01034660 NA
library(dplyr)
library(zoo)

df %>%
    mutate(first_diff = val - lag(val)) %>%
    mutate(preceeding5 = rollsum(lag(first_diff > 0), 5, fill = NA, align = "right")) %>%
    mutate(succeeding5 = rollsum(lead(first_diff < 0), 5, fill = NA, align = "left")) %>%
    mutate(true_max = loc_max &
                      preceeding5 >= 3 &
                      succeeding5 >= 3) %>%
    mutate(true_max = if_else(true_max, TRUE, NA))
          val loc_max  first_diff preceeding5 succeeding5 true_max
1  0.06796823   FALSE          NA          NA           0       NA
2  0.12165540   FALSE  0.05368717          NA           0       NA
3  0.17685980   FALSE  0.05520440          NA           0       NA
4  0.28518490   FALSE  0.10832510          NA           1       NA
5  0.36616820   FALSE  0.08098330          NA           2       NA
6  0.40935790   FALSE  0.04318970          NA           3       NA
7  0.45418170   FALSE  0.04482380           5           3       NA
8  0.48220730    TRUE  0.02802560           5           3     TRUE
9  0.45214280   FALSE -0.03006450           5           2       NA
10 0.40290130   FALSE -0.04924150           4           1       NA
11 0.38103100   FALSE -0.02187030           3           0       NA
12 0.39525690   FALSE  0.01422590           2           1       NA
13 0.40527800   FALSE  0.01002110           2           1       NA
14 0.48172680   FALSE  0.07644880           2           2       NA
15 0.54250300   FALSE  0.06077620           3           3       NA
16 0.56136270    TRUE  0.01885970           4           4     TRUE
17 0.53755350   FALSE -0.02380920           5           4       NA
18 0.57047540    TRUE  0.03292190           4           4     TRUE
19 0.55738850   FALSE -0.01308690           4           4       NA
20 0.50470080   FALSE -0.05268770           3           4       NA
21 0.47487730   FALSE -0.02982350           2           4       NA
22 0.45653140   FALSE -0.01834590           1           4       NA
23 0.45670750    TRUE  0.00017610           1           4       NA
24 0.43722310   FALSE -0.01948440           1           3       NA
25 0.42154800   FALSE -0.01567510           1           3       NA
26 0.41154490   FALSE -0.01000310           1           3       NA
27 0.38138090   FALSE -0.03016400           1           3       NA
28 0.41802160   FALSE  0.03664070           1           4       NA
29 0.42043370    TRUE  0.00241210           1           5       NA
30 0.39982040   FALSE -0.02061330           2           5       NA
31 0.35258890   FALSE -0.04723150           2           5       NA
32 0.32990900   FALSE -0.02267990           2           4       NA
33 0.28508770   FALSE -0.04482130           2           3       NA
34 0.23949280   FALSE -0.04559490           1           3       NA
35 0.19405640   FALSE -0.04543640           0           2       NA
36 0.16321880   FALSE -0.03083760           0           2       NA
37 0.17098540   FALSE  0.00776660           0           2       NA
38 0.17572110    TRUE  0.00473570           1           2       NA
39 0.17464730   FALSE -0.00107380           2           1       NA
40 0.17670690    TRUE  0.00205960           2           2       NA
41 0.16105620   FALSE -0.01565070           3           2       NA
42 0.18609890   FALSE  0.02504270           3          NA       NA
43 0.19083090   FALSE  0.00473200           3          NA       NA
44 0.19506300    TRUE  0.00423210           3          NA       NA
45 0.16865580   FALSE -0.02640720           4          NA       NA
46 0.15830920   FALSE -0.01034660           3          NA       NA