在R中确定序列是否有“间隙”

8

我想确定一个序列中是否包含任何间隙或不规则的步骤?不确定这是否是正确的表述方式,很有可能这是重复的(但我找不到一个好的问题)。

以下的has_gap函数给出了我正确的结果,但似乎有点笨拙?也许有一些内置的功能我还没有发现?

x1 <- c(1:5, 7:10)
x2 <- 1:10
x3 <- seq(1, 10, by = 2)
x4 <- c(seq(1, 6, by = 2), 6, seq(7, 10, by = 2))

has_gap <- function(vec) length(unique(diff(vec))) != 1

vecs <- list(x1, x2, x3, x4)
sapply(vecs, has_gap)
# [1]  TRUE FALSE FALSE  TRUE

你可以尝试:all(diff(x1) == 1) - Gopala
2
@Gopala,这对于 x1x2 可以正确工作,但对于 x3 不行。 - Adam Birenbaum
5
这里有一个备选方案:!!diff(range(diff(x))),另外一个是 var(diff(x)) > 0 - G. Grothendieck
2
has_gap4 <- function(x) !isTRUE(all.equal(cor(x, seq_along(x)), 1)) 对我来说比其他三个函数略快。 - rawr
which(diff(x) > 1)会打印出所有间隙的位置,然后您可以使用has_gap(x) <- function(x) { length(which(diff(x) > 1)) > 0 )。 - wmsmith
显示剩余2条评论
2个回答

1

正如评论中G. Grothendieck所指出的那样,一种方法是:

has_gaps <- \(x)!!diff(range(diff(x)))

另一种方法可能是:
has_gaps2 <- \(x)var(diff(x))>0

如果性能是一个问题,rawr建议:

has_gaps3 <- \(x)!isTRUE(all.equal(cor(x,seq_along(x)),1))

1
library(zoo)
is.regular(x3, strict=TRUE)
is.regular(x3, strict=FALSE)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接