如何查找向量的两个或多个连续元素在R中是否相等

How to find if two or more continuously elements of a vector are equal in R

我想找到一种方法来确定向量的两个或多个连续元素是否相等。

例如向量x=c(1,1,1,2,3,1,3)中,第一个、第二个和第三个元素相等。

使用以下命令,我可以确定一个向量,比如 y,是否包含两个或多个等于 23

的连续元素
all(rle(y)$lengths[which( rle(y)$values==2 | rle(y)$values==3 )]==1)

还有其他更快的方法吗?

编辑

假设我们有向量z=c(1,1,2,1,2,2,3,2,3,3)。 我想要一个包含三个元素的向量作为输出。第一个元素将引用值 1,第二个元素将引用 2,第三个元素将引用 3。如果 z 的两个或多个连续元素与 1,2,3 的一个值相同,则输出向量的元素值将等于 1,否则 0。因此,向量 z 的输出将是 (1,1,1).

对于向量 w=c(1,1,2,3,2,3,1) 输出将是 1,0,0,因为只有值 1 有两个连续的元素,即在第一个和第二个位置w.

假设你的系列名称是z=c(1,1,2,1,2,2,3,2,3,3)那么你可以这样做:

(unique(z[c(FALSE, diff(z) == 0)]) >= 0)+0 将输出到 1, 1, 1,

当你 运行 在你的其他序列上执行上述命令时:

w=c(1,1,2,3,2,3,1)

然后(unique(w[c(FALSE, diff(w) == 0)]) >= 0)+0将return变为1

您也可以试试这个以获得精确的输出,例如 1,1,1 或 1,0,0

(unique(z[c(FALSE, diff(z) == 0)]) == unique(z))+0 #1,1,1 for z and 1,0,0 for w

逻辑:

diff 命令将在相应的第二个和前面的项目之间取差,因为总差总是比项目数少 1,我将第一个项目添加为 FALSE。然后用你的原始序列子集和布尔比较差异 returned 是否为零。最后,我们通过询问它们是否大于或等于 0 将它们转换为 1(要获得一系列 1,您还可以通过一些其他条件来检查它以获得 1)。

假设您的序列没有负数。

我不完全确定我是否理解你的问题,因为它的措辞可以更好。第一部分只是询问如何确定向量中的连续元素是否相等。答案是使用 diff() 函数结合检查是否为零的差异:

z <- c(1,1,2,1,2,2,3,2,3,3)
sort(unique(z[which(diff(z) == 0)]))
# [1] 1 2 3

w <- c(1,1,2,3,2,3,1) 
sort(unique(w[which(diff(w) == 0)]))
# [1] 1

但是您的编辑示例似乎暗示您要查看向量中是否有重复单位,其中只有整数 1、2 或 3。您的输出将始终为 X、Y、Z ,其中

如果至少有一个“1”重复,则X为1,否则为0

如果至少有一个“2”重复,则 Y 为 2,否则为 0

如果至少有一个“3”重复,则Z为3,否则为0

这是正确的吗?

如果是,请看下面

continuously <- function(x){
  s <- sort(unique(x[which(diff(x) == 0)]))
  output <- c(0,0,0)
  output[s] <- s
  return(output)
}

continuously(z)
# [1] 1 2 3
continuously(w)
# [1] 1 0 0