代码之家  ›  专栏  ›  技术社区  ›  George

求向量中的第一个最大值

r
  •  2
  • George  · 技术社区  · 6 年前

    假设我有一个向量

    x <- c(300, 320, 342, 355, 399, 453, 500, 532, 2, 3, 4, 5, 100, 300, 500, 550, 2, 3)
    

    正如你所看到的,它有一些增加的值,然后值减少,然后再增加,依此类推。

    第一个递减的点是值532,然后是值2。所以,在这一点上,我想把值2加到532,所以我现在有了534。然后把值3加到534,然后是值4,然后是值5,依此类推。

    所以,我求和第一次最大值出现后的值,也就是532。

    所以,我的结果是:

    300, 320, 342, 355, 399, 453, 500, 532, 534, 537, 541, 546, 646, 964, 1446, 1996, 1998 , 2001
    

    我正在尝试:

    MY_FUNC <- function(Values)
    {
    
        Values <- Values[!is.na(Values)]
    
        max_val = 0
        index = 0;
        for (i in 1:length(Values))
        {
            if (Values[i] > max_val)
            {
                max_val = Values[i]
                index = i;
                #break when first occurence found
            }
        }
        new_vec <- Values[index] + cumsum(Values[(index + 1):length(Values)])
        new_vec
    
    }
    
    x <- c(300, 320, 342, 355, 399, 453, 500, 532, 2, 3, 4, 5, 100, 300, 500, 550, 2, 3)
    MY_FUNC(x)
    

    但我不知道如何找到循环的第一个最大值出现和中断。

    1 回复  |  直到 6 年前
        1
  •  4
  •   Ronak Shah    6 年前

    我们可以用 diff which.max 查找第一个插入值,然后在该点和 cumsum 在这一点之后的价值观。

    first_drop <- which.max(diff(x) < 0)
    c(x[1:(first_drop - 1)], cumsum(x[first_drop:length(x)]))
    
    #[1]  300  320  342  355  399  453  500  532  534  537  541  546  646  946 1446 1996
    #[17] 1998 2001
    

    如果需要,我们可以在函数中写这个

    MY_FUNC <- function(x) {
      first_drop <- which.max(diff(x) < 0)
      c(x[1:(first_drop - 1)], cumsum(x[first_drop:length(x)]))
    }
    
    MY_FUNC(x)
    # [1]  300  320  342  355  399  453  500  532  534  537  541  546  646  946 1446
    #[16] 1996 1998 2001