Мы можем сделать это намного проще с data.table
.Просто сгруппируйте по идентификатору длины прогона 'group' (rleid
), order
'time' в i
, получите строку индекса (.I
) элементов, которые не duplicated
, где«группа» - это «а» или «б».Используйте это для подмножества строк
library(data.table)
i1 <- setDT(df)[order(time), .I[!duplicated(group == 'a')|
group == 'b'] , .(grp = rleid(group))]$V1
df[i1]
# time group
# 1: 1 a
# 2: 4 b
# 3: 5 b
# 4: 6 b
# 5: 8 a
# 6: 15 b
# 7: 16 b
# 8: 18 b
# 9: 19 a
#10: 21 b
#11: 22 a
#12: 24 b
#13: 25 b
#14: 27 b
#15: 30 a
ПРИМЕЧАНИЕ. Нет if/else
или не требуется зацикливание
data
df <- structure(list(time = c(1L, 2L, 4L, 5L, 6L, 8L, 12L, 15L, 16L,
18L, 19L, 21L, 22L, 23L, 24L, 25L, 27L, 30L), group = c("a",
"a", "b", "b", "b", "a", "a", "b", "b", "b", "a", "b", "a", "a",
"b", "b", "b", "a")), class = "data.frame", row.names = c("1",
"2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13",
"14", "15", "16", "17", "18"))