Как определить последовательные значения выше порога? - PullRequest
0 голосов
/ 26 февраля 2019

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

library(tidyverse)

df <- tibble(
  x = 1:10,
  y = c(1, 3, 4, 1, 5, 34, 43, 1, 45, 3)
)

df
#> # A tibble: 10 x 2
#>        x     y
#>    <int> <dbl>
#>  1     1     1
#>  2     2     3
#>  3     3     4
#>  4     4     1
#>  5     5     5
#>  6     6    34
#>  7     7    43
#>  8     8     1
#>  9     9    45
#> 10    10     3

Я хотел бы найти строку, для которойследующие 2 значения выше определенного порога (скажем, 30).Это приведет к следующему:

tibble(
  x = 1:10,
  y = c(1, 3, 4, 1, 5, 34, 43, 1, 45, 3),
  i = c(FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE)
)
#> # A tibble: 10 x 3
#>        x     y i    
#>    <int> <dbl> <lgl>
#>  1     1     1 FALSE
#>  2     2     3 FALSE
#>  3     3     4 FALSE
#>  4     4     1 FALSE
#>  5     5     5 FALSE
#>  6     6    34 TRUE 
#>  7     7    43 FALSE
#>  8     8     1 FALSE
#>  9     9    45 FALSE
#> 10    10     3 FALSE

У меня большой набор данных (несколько миллионов строк), поэтому я пытаюсь найти эффективное решение.Может быть, используя data.table? Создано в 2019-02-26 пакетом представ. (v0.2.1)

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

data.table версия версии Tidyverse от @G.Grothendieck:

dt <- as.data.table(df)

thresh <- 30

dt[, i := y > thresh & shift(y, -1L, fill = FALSE) > thresh][]

     x  y     i
 1:  1  1 FALSE
 2:  2  3 FALSE
 3:  3  4 FALSE
 4:  4  1 FALSE
 5:  5  5 FALSE
 6:  6 34  TRUE
 7:  7 43 FALSE
 8:  8  1 FALSE
 9:  9 45 FALSE
10: 10  3 FALSE

кредит @Henrik за более короткое выражение для i.Мне нужно было обновить data.table, чтобы использовать его (старая версия не принимала отрицательных значений для аргумента n)

0 голосов
/ 26 февраля 2019

1) Используйте rollapply для пролистывания каждой последовательной пары, проверяя, находятся ли они выше порогового значения:

library(dplyr)
library(zoo)

df %>% mutate(i = rollapply(y > 30, 2, all, align = "left", fill = FALSE))

# A tibble: 10 x 3
       x     y i    
   <int> <dbl> <lgl>
 1     1     1 FALSE
 2     2     3 FALSE
 3     3     4 FALSE
 4     4     1 FALSE
 5     5     5 FALSE
 6     6    34 TRUE 
 7     7    43 FALSE
 8     8     1 FALSE
 9     9    45 FALSE
10    10     3 FALSE

2) Другой подход заключается виспользовать lead:

df %>% mutate(i = y > 30 & lead(y) > 30)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...