Вот подход, использующий dplyr
.
Тест в строке cross_threshold
работает, оценивая, находится ли y с 0,5 стороны от предыдущего y. Если это так, знак двух слагаемых y - threshold
и lag(y) - threshold
будет отличаться, что приведет к ИСТИНА, умноженной на 1, чтобы стать 1
. Если они на одной стороне 0,5, вы получите ЛОЖЬ и 0
. Часть default = 0
имеет дело с первой строкой, где lag (y) не определено. Затем мы складываем, сколько кумулятивных крестов было, чтобы определить группу tmp
.
library(dplyr)
threshold = 0.5
dummy <- data.frame(t = 1:200, x, y) %>%
mutate(cross_threshold = 1 * (sign(y - threshold) != sign(lag(y, default = 0) - threshold)),
# Line above now optional, just if we want to label all crossings
up = 1 * ((y > threshold) & (lag(y) < threshold)),
tmp = if_else(y > threshold, cumsum(up), 0))
ggplot(dummy, aes(x = t, y = x)) +
geom_point(aes(col = as.factor(tmp), group = 1)) +
geom_point(data = filter(dummy, cross_threshold == 1), shape = 21, size = 5)