如果我理解正确,您正在寻找与其两侧相邻的 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) = 沿着向量中的每个位置 i...
diff(range(vv[i:(i+2*n)]))==0) = ...并检查从i到i+2*n的元素是否都相同(如果x的所有元素都相同,diff(range(x))==0将返回TRUE)
将它们全部放入一个函数中,以后可以很容易地改变你对相邻邻居的数量的想法,或者如何处理末端......