如何确定向量中两个或多个连续元素在R中是否相等

时间:2018-08-25 09:03:52

标签: r vector element equals

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

例如,在向量<div class="wrapper"> <div class="reading_chat_left" align="left"> <div class="reading_chat_img" style="min-width: 50px; display: inline-block"> <img class="img_small" src="https://i.ytimg.com/vi/HCjNJDNzw8Y/maxresdefault.jpg"> </div> <div class="reading_chat_text" style="display:inline-block; width: 60%"> <div class="reading_chat_left_name">It goes down</div> <div class="reading_chat_left_text" style="background-color: orange; padding: 5px">abcd blah In this tutorial I will show you how to create Facebook style chat bubbles using CSS only. CSS Code for Chat Bubbles. Here is how chat</div> </div> </div> <div class="reading_chat_left" align="right"> <div class="reading_chat_text" style="display:inline-block; width: 60%; float: left;"> <div class="reading_chat_left_name">It goes down</div> <div class="reading_chat_left_text" style="background-color: orange; padding: 5px">abcd blah In this tutorial I will show you how to create Facebook style chat bubbles using CSS only. CSS Code for Chat Bubbles. Here is how chat</div> </div> <div class="reading_chat_img" style="min-width: 50px; display: inline-block"> <img class="img_small" src="https://i.ytimg.com/vi/HCjNJDNzw8Y/maxresdefault.jpg"> </div> </div>中,第一个,第二个和第三个元素相等。

使用以下命令,我可以确定向量x=c(1,1,1,2,3,1,3)是否包含两个或多个等于y2的连续元素

3

还有其他更快的方法吗?

编辑

假设我们有向量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的两个或多个连续元素对于1的一个值相同,而z的两个或多个连续元素相同,则输出矢量的元素的值将等于1,2,3。因此,向量0的输出将为z

对于向量(1,1,1),输出将为w=c(1,1,2,3,2,3,1),因为仅对于值1,0,0,存在两个连续的元素,即在{{的第一个和第二个位置1}}。

2 个答案:

答案 0 :(得分:1)

假设系列名称为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将返回到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。然后将其与原始序列进行子集化,并进行布尔比较,以得出返回的差是否为零。最后,我们通过询问它们是否大于或等于0来将它们转换为1(要获得1的序列,还可以在其他条件下对其进行检验以得出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