Это из вашего предыдущего примера. Вероятно, есть гораздо более простой способ сделать это, но это должно работать. Существует дополнительная проверка для is.na
минимального индекса, пересекающего порог, для обнаружения случаев, когда никакие значения не превышают его.
threshold <- 7
library(tidyverse)
df %>%
pivot_longer(cols = starts_with("stock_"), names_to = "stock", names_pattern = "stock_(\\d)$") %>%
group_by(stock) %>%
mutate(t = which(value >= threshold)[1]) %>%
filter(!is.na(t) & row_number() >= t) %>%
arrange(stock, time) %>%
select(-t)
Выход
# A tibble: 17 x 3
# Groups: stock [2]
time stock value
<int> <chr> <dbl>
1 2 2 7
2 3 2 8
3 4 2 9
4 5 2 9
5 6 2 7
6 7 2 8
7 8 2 9
8 9 2 10
9 10 2 11
10 11 2 12
11 5 3 7
12 6 3 8
13 7 3 9
14 8 3 5
15 9 3 4
16 10 3 3
17 11 3 6
Данные
df <- data.frame(
time = 1:11,
stock_1 = c(1, 2, 3, 3, 4, 5, 5, 6, 6, 4, 5),
stock_2 = c(6, 7, 8, 9, 9, 7, 8, 9, 10, 11, 12),
stock_3 = c(3, 4, 5, 6, 7, 8, 9, 5, 4, 3, 6)
)