【问题标题】:finding the maxima from a set of local maxima using certain conditions in R使用 R 中的某些条件从一组局部最大值中找到最大值
【发布时间】:2020-01-29 06:30:44
【问题描述】:

我有一个数据,我在我的loc_max 列中获得了由TRUE 值指定的局部最大值。我想根据这些条件从我的局部最大值中识别“真正的最大值”: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)

我应该改变一个包含布尔值的新列,其中我确定的“真正的最大值”将是 TRUE,其余的将是 FALSE。在此先感谢您的帮助。

生成的数据框应如下所示:

          val loc_max true_max
1  0.06796823   FALSE    FALSE
2  0.12165540   FALSE    FALSE
3  0.17685980   FALSE    FALSE
4  0.28518490   FALSE    FALSE
5  0.36616820   FALSE    FALSE
6  0.40935790   FALSE    FALSE
7  0.45418170   FALSE    FALSE
8  0.48220730    TRUE     TRUE
9  0.45214280   FALSE    FALSE
10 0.40290130   FALSE    FALSE
11 0.38103100   FALSE    FALSE
12 0.39525690   FALSE    FALSE
13 0.40527800   FALSE    FALSE
14 0.48172680   FALSE    FALSE
15 0.54250300   FALSE    FALSE
16 0.56136270    TRUE    FALSE
17 0.53755350   FALSE    FALSE
18 0.57047540    TRUE     TRUE
19 0.55738850   FALSE    FALSE
20 0.50470080   FALSE    FALSE
21 0.47487730   FALSE    FALSE
22 0.45653140   FALSE    FALSE
23 0.45670750    TRUE    FALSE
24 0.43722310   FALSE    FALSE
25 0.42154800   FALSE    FALSE
26 0.41154490   FALSE    FALSE
27 0.38138090   FALSE    FALSE
28 0.41802160   FALSE    FALSE
29 0.42043370    TRUE    FALSE
30 0.39982040   FALSE    FALSE
31 0.35258890   FALSE    FALSE
32 0.32990900   FALSE    FALSE
33 0.28508770   FALSE    FALSE
34 0.23949280   FALSE    FALSE
35 0.19405640   FALSE    FALSE
36 0.16321880   FALSE    FALSE
37 0.17098540   FALSE    FALSE
38 0.17572110    TRUE    FALSE
39 0.17464730   FALSE    FALSE
40 0.17670690    TRUE    FALSE
41 0.16105620   FALSE    FALSE
42 0.18609890   FALSE    FALSE
43 0.19083090   FALSE    FALSE
44 0.19506300    TRUE    FALSE
45 0.16865580   FALSE    FALSE
46 0.15830920   FALSE    FALSE

为了清楚起见,我将这个情节包括在内:

【问题讨论】:

  • 你的意思是both前面的5个值和后面的5个值应该至少包含3个FALSE每个i> 前面和后面的?或者是:有一个TRUE,并从那个(总共5个)中给或取2个向量元素,应该至少有3个FALSE
  • 你只是在寻找replace(logical(nrow(df)), which.max(df$val), TRUE)
  • @chinsoon12 不。这只给出最大值。
  • 3 positive first derivative;3 negative first derivative. 是什么意思?
  • 我发布的解决方案与@chinsoon12 的评论相符。

标签: r boolean dplyr


【解决方案1】:

以下是问题描述后的解决方案,但输出与发布的输出不匹配。

truemax <- function(i, X){
  j <- (i - 5):i
  j <- j[j >= 1]
  d <- diff(X$val[j])
  pos <- sum(d > 0) >= 3
  j <- i:(i + 5)
  j <- j[j <= nrow(X)]
  d <- diff(X$val[j])
  neg <- sum(d < 0) >= 3
  pos && neg
}

df$true_max <- FALSE
for(i in which(df$loc_max)){
  df$true_max[i] <- truemax(i, df)
}
df

【讨论】:

    【解决方案2】:

    我修改了 Rui 的解决方案并添加了另一个条件,即确保 true_max 之前和之后的 3 个值必须是正数。

    truemax <- function(i, X){ #try i=16
      j <- (i - 5):(i-1)
      j <- j[j >= 1]
      d <- diff(X$val[j])
      pos <- ifelse(sum(d > 0) >= 3 & mean(X$val[j[3:5]] <= X$val[i]) == 1, TRUE, FALSE)
      j <- i:(i + 5)
      j <- j[j <= nrow(X)]
      d <- diff(X$val[j])
      neg <- ifelse(sum(d < 0) >= 3 & mean(X$val[j[2:4]] <= X$val[i]) == 1, TRUE, FALSE)
      pos && neg
    }
    
    df$true_max <- FALSE
    for(i in which(df$loc_max)){
      df$true_max[i] <- truemax(i, df)
    }
    df
    

    【讨论】:

      猜你喜欢
      • 2012-12-28
      • 2020-05-15
      • 2016-03-16
      • 1970-01-01
      • 1970-01-01
      • 2023-01-05
      • 2015-08-08
      • 1970-01-01
      • 2016-07-13
      相关资源
      最近更新 更多