Как вычислить прогрессивное среднее в векторе, НО перезапуск при выполнении условия? - PullRequest
2 голосов
/ 17 июня 2020

дает следующий вектор

x<-c(0,0,0,5.0,5.1,5.0,6.5,6.7,6.0,0,0,0,0,3.8,4.0,3.6)

Я хотел бы иметь вектор с кумулятивным средним, например

cumsum(x)/seq_along(x)

, но перезапускать вычисление каждый раз, когда разница между двумя последующими значения больше 1,3 или меньше -1,3. Моя цель - получить такой вектор, как

d<-c(0,0,0,5,5.05,5.03,6.5,6.6,6.37,0,0,0,0,3.8,3.9,3.8)

Спасибо

Ответы [ 2 ]

0 голосов
/ 17 июня 2020

Может быть, вы можете попробовать ave + findInterval, как показано ниже

ave(x,findInterval(seq_along(x),which(abs(diff(x))>1.3)+1),FUN = function(v) cumsum(v)/seq_along(v))

, что дает

 [1] 0.000000 0.000000 0.000000 5.000000 5.050000 5.033333 6.500000 6.600000   
 [9] 6.400000 0.000000 0.000000 0.000000 0.000000 3.800000 3.900000 3.800000
0 голосов
/ 17 июня 2020

Вы можете использовать cumsum(abs(diff(x)) > 1.3)) для определения групп, которые используются в aggregate для перезапуска cumsum(x)/seq_along(x) каждый раз, когда разница больше 1,3 или меньше -1,3.

unlist(aggregate(x, list(c(0, cumsum(abs(diff(x)) > 1.3))),
  function(x) cumsum(x)/seq_along(x))[,2])
# [1] 0.000000 0.000000 0.000000 5.000000 5.050000 5.033333 6.500000 6.600000
# [9] 6.400000 0.000000 0.000000 0.000000 0.000000 3.800000 3.900000 3.800000
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...