Среднее значение всех значений сигнала до того, как они упадут до минимума

#r

#r

Вопрос:

у меня есть следующие данные: мне нужно взять среднее значение всех значений, пока оно не упадет до минимального значения, как показано на рисунке ниже. Мне нужно взять среднее значение всех этих значений в выделенной области (красным)

иллюстрация проблемы

 Sample data of signal:
3
3.1
3
3.2
3
3.1
3.2
3
3
3.05
3.25
3.21
3.2
0.4
0.48
0.51
0.65
0.92
1.4
2
3.2
3
3.5
  

Комментарии:

1. сначала вам нужно определить оба термина — «до» и «минимальный».

Ответ №1:

Вы можете найти index минимальное значение и значения подмножества до этого момента и вычислить mean следующим образом:

 dat <- c(3, 3.1, 3, 3.2, 3, 3.1, 3.2, 3, 3, 3.05, 3.25, 3.21, 3.2, 0.4, 0.48, 0.51, 0.65, 0.92, 1.4, 2, 3.2, 3)
mean(dat[seq(max(which.min(dat)[1]-1, 1))])
[1] 3.100769
  

Или использование dplyr в качестве:

 library(dplyr)
tibble(dat) %>%
  filter(row_number() < which.min(dat)) %>%
  summarise(mean = mean(dat))
# A tibble: 1 x 1
   mean
  <dbl>
1  3.10
  

Ответ №2:

Поскольку нам нужно найти среднее значение точек до того, как оно упадет до минимального значения, создайте логический вектор ( v1 <= min(v1) ), получите кумулятивный максимум, преобразуйте TRUE в NA и FALSE в 1, умножьте на точки и получите mean с na.rm значением TRUE

 with(df1, mean(v1 * NA^(cummax(v1 <= min(v1))), na.rm = TRUE))
#[1] 3.100769
  

данные

 df1 <- structure(list(v1 = c(3, 3.1, 3, 3.2, 3, 3.1, 3.2, 3, 3, 3.05, 
 3.25, 3.21, 3.2, 0.4, 0.48, 0.51, 0.65, 0.92, 1.4, 2, 3.2, 3, 
  3.5)), class = "data.frame", row.names = c(NA, -23L))
  

Комментарии:

1. NA^0 equals 1 — потрясающее событие дня!