如何检测阈值以上的连续值?

时间:2019-02-26 18:18:43

标签: r

我有一些数据,我想对其应用滚动函数来检测在哪个点上的值大于特定阈值。

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

我想找到的行的下两个值高于某个阈值(例如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.tablereprex package(v0.2.1)于2019-02-26创建

2 个答案:

答案 0 :(得分:3)

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)

答案 1 :(得分:2)

@G的tidyverse版本的

data.table版本。格洛腾迪克:

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参数没有取负值)