Как отфильтровать данные - PullRequest
0 голосов
/ 15 марта 2020

У меня есть данные временных рядов о разных акциях. Теперь мне нужно отфильтровать их по порогу (например, threshold = 7). Если я теперь применю функцию фильтрации к данным, то она фильтрует все значения выше 7. Но мне нужно, чтобы функция фильтровала только один раз на акцию. Это означает, что как только запас превысил этот предел, он должен быть включен в набор, даже если через некоторое время он снова упадет ниже этого предела. Мои данные в длинном формате, если это помогает или уместно.

Если это вход

>              t        value  Stock 
#> 1          1         3         x
#> 2          2         4         x
#> 3          3         5         x
#> 4          4         6         x
#> 5          5         6         x  
#> 6          1         5         y  
#> 6          2         6         y
#> 6          3         7         y
#> 6          4         8         y
#> 6          5         9         y
#> 6          1         6         z
#> 6          2         7         z
#> 6          3         8         z
#> 6          4         5         z
#> 6          5         4         z

Это должен быть вывод

#> 1            t        value  Stock 
#> 2          3         7         y
#> 3          4         8         y
#> 4          5         9         y
#> 5          2         7         z
#> 6          3         8         z
#> 7          4         5         z
#> 8          5         4         z

1 Ответ

0 голосов
/ 16 марта 2020

Это из вашего предыдущего примера. Вероятно, есть гораздо более простой способ сделать это, но это должно работать. Существует дополнительная проверка для 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)
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...