Если вы смотрите на пары строк, вы можете group_by
2 строки за раз и filter
(сохранять) строки, где разница равна 1.
Редактировать : Ответ также проверяет, чтобы строка first
в паре была 'a', а строка last
в паре - 'b'.
library(tidyverse)
df %>%
group_by(cumsum(row_number() %% 2)) %>%
filter(diff(X) == 1 && first(VAL) == 'a' && last(VAL) == 'b') %>%
ungroup() %>%
select(X, VAL)
Выход
# A tibble: 4 x 2
X VAL
<dbl> <chr>
1 1 a
2 2 b
3 32 a
4 33 b
Данные
df <- structure(list(X = c(1, 2, 5, 9, 32, 33, 40, 42), VAL = c("a",
"b", "a", "b", "a", "b", "b", "a")), class = "data.frame", row.names = c(NA,
-8L))