我有一些数据,我想对其应用滚动函数来检测在哪个点上的值大于特定阈值。
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.table
?
由reprex package(v0.2.1)于2019-02-26创建
答案 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)
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
参数没有取负值)