【问题标题】:How to find if two or more continuously elements of a vector are equal in R如何在R中查找向量的两个或多个连续元素是否相等
【发布时间】:2018-08-25 09:03:51
【问题描述】:

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

例如,在向量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,30 的一个值相同,则输出向量的元素的值将等于1,否则。因此,向量z 的输出将是(1,1,1)

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

【问题讨论】:

  • 请添加一个实际示例和预期结果!
  • @Darren 我编辑了我的问题。

标签: r vector element equals


【解决方案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

【讨论】:

    【解决方案2】:

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

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

    当您在其他序列上运行上述命令时:

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

    然后(unique(w[c(FALSE, diff(w) == 0)]) &gt;= 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)。

    假设您的序列没有负数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多