r - 从 R 中的一组局部最大值中获取真正的最大值
问题描述
我早些时候发布了这个,但我认为我的问题不太清楚,所以我正在更新它并包括我取得的进展。
TRUE
我有一个数据,我在其中获得了由我的loc_max
列中的值指定的局部最大值。我想根据以下条件从这些局部最大值中识别出我的“真实最大值”:1.)局部最大值之前的 5 个值必须至少有 3 个正的一阶导数;AND 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)
我使用从前一个值中减去每个值的简单方法获得一阶导数,如下面的代码所示:
df <- data.frame(val, loc_max)
df2 <- df %>%
mutate(first_diff = val - lag(val))
从那里,我使用以下代码获得了局部最大值的索引:
locmax_ind <- c(which(df2$loc_max == "TRUE"))
现在,这就是我遇到问题的地方......当我将 5 个前面和后面的值子集以满足我的条件时,我编写了以下代码:
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)
它给了我only the first used
警告,似乎无法提取结果中的其他元素。
我的最终目标是生成一个如下所示的数据框:
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
你能检查一下,是你错了还是我错了?
推荐阅读
- c# - 如何使用读取文件的数据
- postgresql - 'GROUP BY' postgresql 上的 'OR' 语句
- c# - 将日期时间转换为 base36
- scheme - 如何修复“应用程序:不是程序;” 在 DrRacket 中尝试使用引用函数时
- c# - WinSCP .NET 程序集在处理过程中会抛出哪些异常类型
- excel - 我正在尝试将我的 Excel 工作簿拆分为多个工作簿,但代码有问题
- windows - Julia,Windows 10 上的 ArchGDAL 安装错误
- c# - 如何隔离第 3 方 .NET 库的传递程序集依赖项?
- c# - 创建 Telerik 报告列表对象
- scala - Spark写入多个文件