Вот идея использования tidyverse
.Мы группируем по ID
и удаляем все группы только с 1 наблюдением.Затем мы создаем логический столбец со значениями_3, равными следующим значениям_1.Затем мы используем fill
для заполнения оператора и используем эту переменную для фильтрации
library(tidyverse)
df %>%
group_by(ID) %>%
filter(n() > 1) %>%
mutate(new = VALUE_3 == lead(VALUE_1)) %>%
fill(new) %>%
filter(new) %>%
ungroup() %>%
select(-new)
, что дает
# A tibble: 5 x 4
ID VALUE_1 VALUE_2 VALUE_3
<fct> <int> <int> <int>
1 Amber 23 33 47
2 Amber 47 25 69
3 Bob 34 25 52
4 Bob 52 78 93
5 Bob 93 11 83
Пара data.table
способы достижения вышеуказанного (комплименты @akrun и @Frank)
library(data.table)
setDT(df)[, .SD[cummax(.N >1 & VALUE_3 == shift(VALUE_1, type = 'lead', fill = last(VALUE_1))) > 0], ID] -- #akrun
w = DF[VALUE_1 == shift(VALUE_3) & ID == shift(ID), which = TRUE]
DF[unique(sort(c(w, w-1)))] -- #Frank