Один вариант с данными. Нет реальной причины использовать это вместо lag
/ shift
при n = 2, но для больших n это избавит вас от создания большого числа новых векторов с задержкой.
library(data.table)
which(rowid(rleid(t1)) > 2)
# [1] 4 11 12
Пояснение:
rleid
будет генерировать уникальное значение для каждого "прогона" равных значений, а rowid
будет отмечать, сколько элементов "в" прогоне каждого элемента. То, что вы хотите, это элементы больше, чем на 2 "в" пробег.
data.table(
t1,
rleid(t1),
rowid(t1))
# t1 V2 V3
# 1: 1 1 1
# 2: 10 2 1
# 3: 10 2 2
# 4: 10 2 3
# 5: 14 3 1
# 6: 37 4 1
# 7: 3 5 1
# 8: 14 6 2
# 9: 8 7 1
# 10: 8 7 2
# 11: 8 7 3
# 12: 8 7 4
# 13: 39 8 1
# 14: 12 9 1
Редактировать: Если, как в примере, поставленном этим вопросом, никакие два прогона (даже "прогоны" длины-1) не имеют одинакового значения (или если вам все равно, находятся ли дубликаты рядом друг с другом), вместо этого вы можете использовать which(rowid(t1) > 2)
. (Это отмечает Фрэнк в комментариях)
Надеюсь, этот пример прояснит различия
a <- c(1, 1, 1, 2, 2, 1)
which(rowid(a) > 2)
# [1] 3 6
which(rowid(rleid(a)) > 2)
# [1] 3