R: найти последовательные значения ниже порога

Мне нужно найти последовательные значения в data.frame измерений скорости ветра, которые меньше определенного порога. Я ищу 2 последовательных наблюдения ниже порога. Я хочу вернуть место первого наблюдения серии, которое соответствует этим критериям.


person ChrM    schedule 10.05.2016    source источник
comment
Пожалуйста, предоставьте некоторые образцы данных через dput(dataframe_name). См.: stackoverflow.com/questions/5963269/   -  person coatless    schedule 10.05.2016


Ответы (1)


Следующее должно работать для того, о чем вы просите:

# create random vector, for example
set.seed(1234)
temp <- rnorm(50)

# get position of all observations that fulfill criterion, here obs is > 0.2
thresholdObs <- which(temp > .2)

Здесь which возвращает позицию всех наблюдений, удовлетворяющих некоторому критерию. На этом этапе разумно проверить, есть ли какие-либо наблюдения, удовлетворяющие вашему критерию. Этого можно добиться с помощью функции intersect или подмножества вместе с оператором %in%:

length(intersect(thresholdObs, thresholdObs + 1))

or

length(thresholdObs[thresholdObs %in% (thresholdObs + 1L)])

Если возвращается длина 0, то в ваших данных нет такого наблюдения. Если длина равна 1 или больше, вы можете использовать

# get the answer
min(thresholdObs[thresholdObs %in% (thresholdObs + 1L)] - 1)

or

min(intersect(thresholdObs, thresholdObs + 1))-1

Как отмечает @Frank ниже, если min подается вектор длины 0, он возвращает Inf, что означает бесконечность в R. Я увеличиваю эти позиции на thresholdObs + 1 и беру пересечение этих двух наборов. Возвращаются только те позиции, где предыдущая позиция проходит пороговый тест. Затем я вычитаю 1 из этих позиций и беру минимум, чтобы получить желаемый результат. Поскольку which вернет упорядоченный результат, также будет работать следующее:

intersect(thresholdObs, thresholdObs + 1)[1] - 1

где [1] извлекает первый элемент пересечения.

Также обратите внимание, что

intersect(thresholdObs, thresholdObs + 1) - 1

or

thresholdObs[thresholdObs %in% (thresholdObs + 1L)]

вернет все позиции, в которых есть как минимум два последовательных элемента, которые превышают пороговое значение. Однако будет возвращено несколько позиций для последовательных значений, превышающих пороговое значение, превышающее 2.

person lmo    schedule 10.05.2016
comment
Данные вашего примера дают Inf, потому что перекресток пуст, и это то, что дает min(numeric(0)). Безопаснее/проще может быть w = which(temp > .5); w[ w %in% (w + 1L) ] - person Frank; 10.05.2016
comment
@Frank Это кажется более безопасным вариантом. - person lmo; 10.05.2016