如何找到R中最长的相同数字

时间:2014-11-11 04:30:39

标签: r

例如我有这样的数据

x<-c(0,0,1,1,1,1,0,0,1,1,0,1,1,1)

我想找到最长的&#34; 1&#34;通过考虑开始和结束位置,在这种情况下应该是(3,6)

如何在R

中执行此操作

感谢所有

2 个答案:

答案 0 :(得分:5)

这是一种使用“cgwtools”包中的seqle的方法:

library(cgwtools)
y <- seqle(which(x == 1))
z <- which.max(y$lengths)
y$values[z] + (sequence(y$lengths[z]) - 1)
# [1] 3 4 5 6

如果您只想要“3”和“6”,则可以使用range

seqle“扩展rle以查找和编码线性序列”。


以下是作为函数的答案:

longSeq <- function(invec, range = TRUE) {
  require(cgwtools)
  y <- seqle(which(invec == 1))
  z <- which.max(y$lengths)
  out <- y$values[z] + (sequence(y$lengths[z]) - 1)
  if (isTRUE(range)) range(out) else out
}

用法是:

x <- c(0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1)
longSeq(x)
# [1] 3 6
longSeq(x, range = FALSE)
# [1] 3 4 5 6

并且,以KFB的示例输入:

y <- c(0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1)
longSeq(y)
# [1]  9 11

答案 1 :(得分:2)

使用rleinverse.rle组合

,您也可以使用基数R轻松完成此操作

创建功能

longSeq2 <- function(x, range = TRUE){
  temp <- rle(x == 1)
  temp$values <- temp$lengths == max(temp$lengths[temp$values == TRUE]) 
  temp <- which(inverse.rle(temp))
  if (isTRUE(range)) range(temp) else temp
}

<强>测试

x <- c(0,0,1,1,1,1,0,0,0,0,0,0,0,1,1,0,1,1,1)
longSeq2(x)
## [1] 3 6
longSeq2(x, range = FALSE)
## [1] 3 4 5 6

y <- c(0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1)
longSeq2(y)
## [1] 9 11
longSeq2(y, range = FALSE)
## [1] 9 10 11