С dplyr
:
bind_rows(
filter(group_by(data,V4), !any(V4==V8),V8==max(V8)),
filter(group_by(data,V4), any(V4==V8),V4==V8)
)
Результат:
# A tibble: 9 x 8
# Groups: V4 [7]
V1 V2 V3 V4 V5 V6 V7 V8
<int> <int> <int> <int> <int> <int> <int> <int>
1 1 11590 18647 4 1 15040 15500 3
2 1 440900 443400 2 1 440900 441080 1
3 1 440900 443400 2 1 443140 443400 1
4 1 712695 715758 14 1 713010 713230 8
5 1 751500 759199 8 1 752555 752773 5
6 1 9708 10948 1 1 9708 10948 1
7 1 108570 109500 1 1 108570 109500 1
8 1 539670 542200 3 1 540450 541070 3
9 1 761083 764000 9 1 762300 762800 9
Вы можете сделать то же самое в базе R с помощью split. Идея состоит в том, что вы разбиваете данные на группы на основе значения V4, а затем выбираете группы, в которых есть какой-либо случай V4 == V8, и извлекаете из него этот ряд, а также группы, в которых такого случая нет, и затем вы вытяните оттуда ряд (ы), где V8 - это макс.