Как мне создать функцию, которая определяет движущийся порог вдоль локальных максимумов в R? - PullRequest
0 голосов
/ 18 апреля 2020

Цель состоит в том, чтобы количественно оценить определенный рост. Определение следующее: Каждое значение в последовательности должно сравниваться с предыдущим значением, и если следующее значение больше предыдущего, оно должно быть учтено (возвращено). Если нет, он должен быть отброшен. Следовательно, большее значение используется в качестве новой ссылки для следующих. Порог, который перемещается с возрастающими значениями. Я пробовал это:

growthdata<-c(21679, 21722, 21788, 21863, 21833, 21818, 21809, 21834, 21937, 22026, 22025, 22235, 22191, 22348, 22399, 22463, 22532, 22562, 22589, 22609, 22556, 22565)
growthfun<-function (a) {
  for (i in a) {
    if (i < (i+1)) {
      return(i)
    }
    else {
      next
      }
  }
}

Это проблема новичка. Кажется, я не в состоянии определить следующее значение (i + 1). Как я написал, R просто добавляет 1 к значению i. Результат должен выглядеть следующим образом:

21679, 21722, 21788, 21863, 21937, 22026, 22235, 22348, 22399, 22463, 22532, 22562, 22589, 22609

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 18 апреля 2020

В вашей функции есть некоторые проблемы growthfun:

  1. То, что вам нужно, может быть print, а не return. В противном случае функция завершается при выполнении условия
  2. . Вам может понадобиться индекс элементов в a, который должен быть i in seq_along(a)

Пример для вас цель может быть примерно такой:

  • Если вы хотите напечатать прогресс, используйте print
growthfun<-function (a) {
  for (i in seq_along(a)) {
    if (a[i] >= max(a[1:(i-1)])) {
      print(a[i])
    }
    else {
      next
    }
  }
}

, что дает

> growthfun(growthdata)
[1] 21679
[1] 21722
[1] 21788
[1] 21863
[1] 21937
[1] 22026
[1] 22235
[1] 22348
[1] 22399
[1] 22463
[1] 22532
[1] 22562
[1] 22589
[1] 22609
  • Если вы хотите сохранить вывод в массиве
growthfun<-function (a) {
  r <- c()
  for (i in seq_along(a)) {
    if (a[i] >= max(a[1:(i-1)])) {
      r <- c(r,a[i])
    }
    else {
      next
    }
  }
  r
}

, что дает

> growthfun(growthdata)
 [1] 21679 21722 21788 21863 21937 22026 22235 22348 22399 22463
[11] 22532 22562 22589 22609
0 голосов
/ 18 апреля 2020

Вы можете использовать cummax только с unique значениями.

unique(cummax(growthdata))
#[1] 21679 21722 21788 21863 21937 22026 22235 22348 22399 22463 22532 22562 22589 22609
...