此dplyr 解决方案允许您获取列中的更改量,并且还将创建一个逻辑列,如果在任一方向上超过阈值,您将在其中获得TRUE。例如,在第 4 行中,该值已从 2 增加到 5,因此已超过阈值。但是,在第 5 行,该值保持在 5,因此第 4 行和第 5 行之间没有超过阈值。当我们到达第 6 行时,该值已降至 4,低于阈值,因此我们得到 @987654323 @在这一行再次。
为了清楚起见,我已将阈值设置为 4.5。
library(dplyr)
threshold <- 4.5
df %>%
group_by(group) %>%
mutate(change_amount = c(0, diff(value)),
crossed_thresh = sign(lag(value - threshold)) !=
sign(value - threshold),
crossed_thresh = ifelse(is.na(crossed_thresh), FALSE,
crossed_thresh))
#> # A tibble: 10 x 6
#> # Groups: group [2]
#> group value month change change_amount crossed_thresh
#> <chr> <int> <chr> <lgl> <dbl> <lgl>
#> 1 A 2 2019-2 FALSE 0 FALSE
#> 2 A 2 2019-3 FALSE 0 FALSE
#> 3 A 2 2019-4 FALSE 0 FALSE
#> 4 A 5 2019-5 TRUE 3 TRUE
#> 5 A 5 2019-5 FALSE 0 FALSE
#> 6 A 4 2019-8 TRUE -1 TRUE
#> 7 A 4 2019-9 TRUE 0 FALSE
#> 8 B 23 2019-5 FALSE 0 FALSE
#> 9 B 7 2019-9 TRUE -16 FALSE
#> 10 B 7 2020-5 FALSE 0 FALSE
数据
df <- structure(list(group = c("A", "A", "A", "A", "A", "A", "A", "B",
"B", "B"), value = c(2L, 2L, 2L, 5L, 5L, 4L, 4L, 23L, 7L, 7L),
month = c("2019-2", "2019-3", "2019-4", "2019-5", "2019-5",
"2019-8", "2019-9", "2019-5", "2019-9", "2020-5"), change = c(FALSE,
FALSE, FALSE, TRUE, FALSE, TRUE, TRUE, FALSE, TRUE, FALSE
)), class = "data.frame", row.names = c(NA, -10L))
df
#> group value month change
#> 1 A 2 2019-2 FALSE
#> 2 A 2 2019-3 FALSE
#> 3 A 2 2019-4 FALSE
#> 4 A 5 2019-5 TRUE
#> 5 A 5 2019-5 FALSE
#> 6 A 4 2019-8 TRUE
#> 7 A 4 2019-9 TRUE
#> 8 B 23 2019-5 FALSE
#> 9 B 7 2019-9 TRUE
#> 10 B 7 2020-5 FALSE