Если я правильно понял, вы ищете значения, которые совпадают с их 2 смежными значениями с обеих сторон, и в этом случае вы будете рады игнорировать «пропущенные» смежные значения для 2 первых и 2 последних ценности.
Использование базы R:
sameasadj=function(v,n=2,include_ends=T) {
if(include_ends){vv=c(rep(head(v,1),n),v,rep(tail(v,1),n))}
else {vv=c(rep(NA,n),v,rep(NA,n))}
sapply(seq_along(v),function(i) diff(range(vv[i:(i+2*n)]))==0)
}
df$comp = sameasadj(df$a)
df$comp
Вывод:
[1] FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE
Объяснение:
sameasadj=function(v,n=2,include_ends=T)
= определить функцию sameasadj, чтобы проверить, является ли каждое значение совпадает с соседними соседями с каждой стороны. Мы можем дать возможность выбрать число n соседних соседей (в вашем случае 2) и включать или не включать концы (или возвращать 'NA' для них, поскольку у них недостаточно соседей на одной стороне).
if(include_ends){vv=c(rep(head(v,1),n),v,rep(tail(v,1),n))}
= если мы хотим включить концы, то мы просто добавляем «отсутствующие» соседи, чтобы они соответствовали
else {vv=c(rep(NA,n),v,rep(NA,n))}
= в противном случае мы добавляем значения «NA»
sapply(seq_along(v),function(i)
= go вдоль каждой позиции i в векторе ...
diff(range(vv[i:(i+2*n)]))==0)
= ... и проверьте, все ли элементы от i до i + 2 * n являются то же самое (diff(range(x))==0
вернет TRUE
, если все элементы x одинаковы)
Поместив все это в функцию, вы сможете позже передумать о количестве соседних соседей или о том, что делать с концами ...