Привет. Я пытаюсь настроить функцию для поиска событий, в которых временная серия переходит от нижнего порога к более высокому за определенное количество временных шагов, но я чувствую, что должно быть более элегантное решение, и я Я не уверен на 100% Я захватил все дела
Пример данных
df <- data.frame(DateTime = seq.POSIXt(from = as.POSIXct("2019-01-01"),to = as.POSIXct("2019-01-02"), by ="hour"),
Value = c(1,9,150,9,150,120,110,50,60,50,50,5,5,7,5,110,110,40,110,2,8,120,5,130,120))
Вот основная логика. Для minThresh и maxThresh (скажем, 10 и 100) и размера окна (здесь 4 дано в slide
), я хочу сказать, что эта точка является пиком (output = 1), если все ниже:
- Это значение (последнее в окне) выше maxThresh
- Одно из значений в окне ниже minThresh
- Поскольку в последнем minThresh никакое другое значение не находится выше maxThresh (поэтому, если значения в окне (7,5,110,110), эта точка НЕ будет пиковой, поскольку предыдущее значение будет присвоено как единое)
Вот что у меня есть
library(dplyr)
library(tsibble)
myfun <- function(dat, minThresh=10, maxThresh=100){
thisVal <- dat[length(dat)]
#Check this value > max threshold
if(!thisVal > maxThresh) return(0)
#Check there is a value less than min threshold
belowThreshol <- which(dat<minThresh)
if(length(belowThreshol)==0) return(0)
#reset values after going above max and below min (so first peak doesn't stop 2nd peak counting)
# eg for case (dat = c(1,500,2,500)) resets at 2
aboveThreshol <- (dat>maxThresh)
aboveThreshol[1:max(belowThreshol)] <- FALSE
#check that thisValue is the first (after reset) > maxThresh
if(min(which(aboveThreshol)) < length(dat)) return(0)
return(1)
}
df %>% mutate(test = slide_dbl(Value, myfun, .size = 4))
Я бы предпочел, если возможно, решение по тидиверсу