Я хотел бы получить временной шаг во временном ряду, удовлетворяющий следующим условиям, используя R (должен быть первым временным шагом, удовлетворяющим следующим условиям):
[1] V1 > 0 at the time step
[2] V1 > 0 in at least 3 consecutive time steps from the timestep obtained in [1]
[3] Accumulated value of the next four timesteps following [1] should be greater than 1.
Вот данные
structure(list(V1 = c(-3.85326, -2.88262, -4.1405, -3.95193,
-6.68925, -2.04202, -2.47597, -4.91161, -2.5946, -2.82873, 2.68839,
-4.1287, -4.50296, -0.143476, -1.12174, -0.756168, -1.67556,
-1.92704, -1.89279, -2.37569, -5.71746, -2.7247, -4.12986, -2.29769,
-1.52835, -2.63623, -2.31461, 2.32796, 4.14354, 4.47055, -0.557311,
-0.425266, -2.37455, -5.97684, -5.22391, 0.374004, -0.986549,
2.36419, 0.218283, 2.66014, -3.44225, 3.46593, 1.3309, 0.679601,
5.42195, 10.6555, 8.34144, 1.64939, -1.64558, -0.754001, -4.77503,
-6.66197, -4.07188, -1.72996, -1.15338, -8.05588, -6.58208, 1.32375,
-3.69241, -5.23582, -4.33509, -7.43028, -3.57103, -10.4991, -8.68752,
-8.98304, -8.96825, -7.99087, -8.25109, -6.48483, -6.09004, -7.05249,
-4.78267)), class = "data.frame", row.names = c(NA, -73L))
Что у меня есть до сих пор
Мне удалось объединить условия 1 и 2. Вот сценарий.
first_exceed_seq <- function(x, thresh = 0, 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[,1])
Это дает 28. Это должен быть правильный ответ, но мне было интересно узнать о следующей проблеме.
Проблема
1) Я хочу добавить третье условие в вышеупомянутую функцию так, чтобы сумма от 29 до 32 была больше 1. Из вышеупомянутой функции я установил минимальную длину в 3. Я будуприменяя это к нескольким временным рядам, я могу столкнуться с временным рядом, который имеет четыре последовательных положительных значения или больше, и первый временной шаг из этого не удовлетворяет [3], скорее это 2-й или 3-й временные шаги и т. д.
Любое предложение о том, как это сделатьтакое R?Я буду признателен за любую помощь.
Обновление: я пробовал решение ниже, но dplyr выдает предупреждающие сообщения.
1: In filter_impl (.data, quo): гибридная оценка принудительнодля lead
.Пожалуйста, используйте dplyr :: lead () или library (dplyr), чтобы удалить это предупреждение.
Также правильный ответ должен быть 28, потому что он удовлетворял первым всем трем условиям.