найти первое максимальное вхождение в векторе - PullRequest
0 голосов
/ 27 сентября 2018

Допустим, у меня есть вектор

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

Как вы можете видеть, он имеет некоторые увеличивающиеся значения, затем значения уменьшаются, затем снова увеличиваются и т. Д.

Точка, в которойпервое уменьшение находится в значении 532, за которым следует значение 2. Итак, в этот момент я хочу добавить к 532 значение 2, поэтому у меня теперь 534. Затем добавьте к 534 значение 3, затем значение 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 Ответ

0 голосов
/ 27 сентября 2018

Мы можем использовать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...