Получение последнего числа в ряду перед его понижением ниже порогового значения в R

#r #csv

#r #csv

Вопрос:

У меня есть следующие данные:

 dat<- structure(list(Pentad = 1:73, RR = c(0, 0.014285714, 0, 0.088571429, 
0.071428571, 0, 0.065714286, 0.028571429, 0.094285714, 0.011428571, 
0, 0, 0, 0, 0, 0, 0.04, 0, 0.814285714, 0.285714286, 1.14, 5.334285714, 
2.351428571, 1.985714286, 1.494285714, 2.005714286, 20.04857143, 
25.00857143, 16.32, 11.06857143, 8.965714286, 3.985714286, 5.202857143, 
7.802857143, 4.451428571, 9.22, 32.04857143, 19.50571429, 3.148571429, 
2.434285714, 9.057142857, 28.70857143, 34.15142857, 33.02571429, 
46.50571429, 70.61714286, 3.168571429, 1.928571429, 7.031428571, 
0.902857143, 5.377142857, 11.35714286, 15.04571429, 11.66285714, 
21.24, 11.43714286, 11.69428571, 2.977142857, 4.337142857, 0.871428571, 
1.391428571, 0.871428571, 1.145714286, 2.317142857, 0.182857143, 
0.282857143, 0.348571429, 0, 0.345714286, 0.142857143, 0.18, 
4.894285714, 0.037142857), YY = c(0.577142857, 0, 1.282857143, 
1.445714286, 0.111428571, 0.36, 0, 0, 0, 1, 0.011428571, 0.008571429, 
0.305714286, 0, 0, 0, 0, 0.8, 0.062857143, 0, 0, 0, 0, 0.013333333, 
0.043333333, 1.486666667, 0, 2.486666667, 1.943333333, 0.773333333, 
8.106666667, 7.733333333, 0.5, 4.356666667, 2.66, 6.626666667, 
4.404285714, 7.977142857, 12.94285714, 18.49428571, 7.357142857, 
11.08285714, 9.034285714, 14.29142857, 34.61428571, 45.30285714, 
6.66, 6.702857143, 5.962857143, 14.85428571, 2.1, 2.837142857, 
7.391428571, 32.03714286, 9.005714286, 3.525714286, 12.32, 2.32, 
7.994285714, 6.565714286, 4.771428571, 2.354285714, 0.005714286, 
2.508571429, 0.817142857, 2.885714286, 0.897142857, 0, 0, 0, 
0, 0.145714286, 0.434285714)), class = "data.frame", row.names = c(NA, 
-73L))
 

Есть три столбца: Pentad, RR и YY.

Я хотел бы получить следующее:

(a) Получить первую пентаду, когда количество осадков превысит «среднегодовое значение» в «по крайней мере, трех последовательных пентадах»

(b) Получите последнюю пентаду, когда количество осадков превысит «среднегодовое значение» по крайней мере в трех последовательных пентадах, ПРЕЖДЕ чем опускать его ниже среднегодового значения.

Я смог выполнить (a), используя следующий скрипт:

 first_exceed_seq <- function(x, thresh = mean(x), len = 3)
{
  # Logical vector, does x exceed the threshold
  exceed_thresh <- x > thresh

  # Indices of transition points; where exceed_thresh[i - 1] != exceed_thresh[i]
  transition <- which(diff(c(0, exceed_thresh)) != 0)

  # Reference index, grouping observations after each transition
  index <- vector("numeric", length(x))
  index[transition] <- 1
  index <- cumsum(index)

  # Break x into groups following the transitions
  exceed_list <- split(exceed_thresh, index)

  # Get the number of values exceeded in each index period
  num_exceed <- vapply(exceed_list, sum, numeric(1))

  # Get the starting index of the first sequence where more then len exceed thresh
  transition[as.numeric(names(which(num_exceed >= len))[1])]
  }

  first_exceed_seq(dat$RR)
 

Вот график временного ряда:

примерный график

Правильный ответ в (a) — 27.

Я хотел бы спросить, как я могу это сделать для (b). Правильный ответ для (b) должен быть 57.

Я буду признателен за любую помощь в этом в R.

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

1. На всякий случай, RR — это количество осадков, а среднегодовое значение — это среднее значение RR, правильно?

2. Разве вы не можете сделать что-то вроде: length(dat$RR) - first_exceed_seq(rev(dat$RR)) 1 ?

3. @MarcioRodrigues да!!

4. @Mako БОЖЕ мой! да!!

Ответ №1:

Я не знаю, правильно ли я понял вашу проблему.

Это то, что я пробовал:

 dat %>% 
  mutate(
    anual_mean = mean(RR),
    exceed_thresh = RR > anual_mean,
    lag1 = lag(exceed_thresh, 1),
    lag2 = lag(exceed_thresh, 2),
    pick_3 = ifelse(exceed_thresh amp; lag1 amp; lag2, RR, NA)
  )